Главная страница / Блог / Задачки по программированию / Решаем задачку по JavaScript «Reverse Integer»

Решаем задачку по JavaScript «Reverse Integer»

Условие

Дано 32-битное целое число, необходимо вернуть перевернутое ему число, при этом если трансформированное число превышает 32 бита, вернуть 0. — источник

Given a 32-bit signed integer, reverse digits of an integer. Return 0 when the reversed integer overflows 32-bit.

Решение

Быстрое, но не гибкое

Подобного рода задачи встречаются очень часто и в разных вариациях. Если можно так выразиться, это базовое условие, которое может масштабироваться и усложняться, поэтому быстрое решение с реверсом строки сработает, но будет недостаточно гибким.

var reverse = function(x) {
    const reversed =  parseInt(Math.abs(x).toString().split('').reverse().join(''), 10) * Math.sign(x);

    return (reversed <= 0x7fffffff) ? reversed : 0;
};

Здесь Math.abs() дает нам модуль числа, на случай отрицательного аргумента (с положительным числом можно не заботится о том куда попадет минус при реверсе), toString() преобразует число в строку, split() разбивает строку в массив символов для того, чтобы в последствии можно было применить метод reverse(). На этом этапе мы получаем массив символов (числа в строковом виде) в обратном порядке и все что нам нужно, это обратно склеить массив в строку с помощью join() и приобразовать строку в число с помощью parseInt(). Для того, чтобы вернуть знак входного параметра мы используем Math.sign(). Далее, так как в условии у нас есть ограничение в 32 бита, мы проверяем результат и возвращаем его или ноль, если число не проходит проверку. С методами массива можно ознакомится на этой страничке документации.

Более гибкий вариант

Для того, чтобы при каждом новом условии в подобной задаче не увеличивать количество приведений типов, лучше использовать более гибкий вариант, а именно, брать остаток от деления на 10 (что по сути будет являться числом последнего разряда) и прибавлять его к десятичной основе ранее преборазованого числа (изначально нуля).

var reverse = function(source) {
    let res = 0;
    let x = Math.abs(source);

    while (x != 0) {
        res = res * 10 + x % 10;
        x = Math.floor(x / 10);
    }

    return 0x7fffffff <= res ? 0 : res * Math.sign(source); 
};

При аргументе source = 123, на первой итерации, res * 10 будет равен нулю, x % 10 даст нам число 3, что в результате выполнения res * 10 + x % 10 запишет тройку в переменную res. Строка x = Math.floor(x / 10); подготовит наш аргумент к следующей итерации и при первом проходе даст нам 12. Цикл while будет отрабатывать до тех пор, пока x не будет равен 0, ну а после, без лишних пробразований из одного типа данных в другой мы делаем проверку и возвращаем результат.

Russian
Прокрутить вверх