Умова
Дано 32-бітове ціле число, необхідно повернути перевернене йому число, при цьому якщо трансформоване число перевищує 32 біти, повернути 0. джерело
Given a 32-bit signed integer, reverse digits of an integer. Return 0 коли перетворюється 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, ну а після, без зайвих перетворень з одного типу даних в інший ми робимо перевірку і повертаємо результат.