Условие
Дано 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, ну а после, без лишних пробразований из одного типа данных в другой мы делаем проверку и возвращаем результат.