Как перевернуть число в JavaScript: простые способы с примерами
-
Перевернуть число в JavaScript - задача, которая часто встречается на собеседованиях или в тренировках по алгоритмам. Нужно взять число вроде 123 и получить 321, сохранив тип number. Это полезно для практики работы со строками, массивами и циклами, а также помогает понять нюансы преобразований данных.
Проблема возникает с отрицательными числами или ведущими нулями, например, 1000 должно стать 1, а не 0001. Мы разберем проверенные методы, чтобы избежать ошибок и выбрать оптимальный подход для вашего кода.
Метод 1: Через преобразование в строку и встроенные методы
Самый быстрый способ - превратить число в строку, разбить на массив символов, перевернуть его и собрать обратно в число. Это использует toString(), spread-оператор […] и методы reverse() с join(). Подход работает для положительных чисел мгновенно, но требует доработки для отрицательных.
Рассмотрим пример: число 12345. После toString() получается “12345”, spread делает массив [‘1’,‘2’,‘3’,‘4’,‘5’], reverse() меняет на [‘5’,‘4’,‘3’,‘2’,‘1’], join(‘’) дает “54321”, а Number() возвращает 54321. Легко и читаемо, но будьте осторожны с нулями - 100 станет “001”, что превратится в 1.
- Шаг 1:
num.toString()- число в строку. - Шаг 2:
[...str]илиstr.split('')- строка в массив символов. - Шаг 3:
.reverse()- переворот массива на месте. - Шаг 4:
.join('')- массив в строку. - Шаг 5:
Number()или+- обратно в число.
function reverseNumber(num) { return +num.toString().split('').reverse().join(''); } console.log(reverseNumber(12345)); // 54321Входное число Результат Проблемы 123 321 Нет 100 1 Удалены нули -123 321 Потерян знак Метод 2: Математический алгоритм без строк
Здесь мы работаем только с числами, извлекая цифры через остаток от деления и строя новое число. Используем цикл while, num % 10 для последней цифры и Math.trunc(num / 10) для удаления ее. Это эффективно по памяти и работает с отрицательными числами при доработке.
Пример для 123: result = 0, num % 10 = 3, num = 12; result = 30 + 2 = 32, num = 1; result = 320 + 1 = 321. Преимущество - нет преобразований типов, но нужно обрабатывать знак отдельно с Math.abs() и возвращать с минусом.
- Цикл while (num): Пока число не 0.
- result = result * 10 + (num % 10): Добавляем цифру впереди.
- num = Math.trunc(num / 10): Сдвигаем цифры.
- Обработка знака: Если num < 0, умножаем на -1.
function reverseNumber(num) { let result = 0; num = Math.abs(num); while (num) { result = result * 10 + (num % 10); num = Math.trunc(num / 10); } return num < 0 ? -result : result; } console.log(reverseNumber(-123)); // -321Преимущества Недостатки Сложность Быстро по памяти Цикл сложнее понять O(n) Работает с отрицательными Не для очень больших чисел Низкая Метод 3: Цикл for и рекурсия для продвинутых
Цикл for проходит строку с конца к началу, строя результат. Рекурсия же берет первую и последнюю цифры, вызывая себя для подстроки. Первый вариант проще, второй - элегантен, но рискован для больших чисел из-за стека вызовов.
Для 123 в for: i=2, res=‘3’; i=1, res=‘23’; i=0, res=‘321’. Рекурсия: reverse(‘123’) = ‘3’ + reverse(‘12’) = ‘321’. Подходит для обучения алгоритмам.
- For с toString():
for (let i = str.length - 1; i >= 0; i--). - Рекурсия:
if (str === '') return ''; return str.slice(-1) + reverse(str.slice(0,-1));. - Преобразование: Number(result).
function reverseFor(num) { let str = num.toString(); let res = ''; for (let i = str.length - 1; i >= 0; i--) { res += str[i]; } return +res; }Сравнение производительности и выбор метода
Метод Скорость Читаемость Отрицательные Объем кода Строки + reverse Высокая Отличная С доработкой Минимальный Математика Высокая Средняя Да Средний For/Рекурсия Средняя Хорошая С доработкой Больше Выберите строки для простоты, математику для эффективности. Тестируйте на edge-кейсах вроде 0 или 10^15.
Когда строки дают преимущество
Строки выигрывают в современном JS из-за оптимизаций V8. Но для чистого алгоритма берите цикл. Подумайте о палиндромах - легко проверить равенством num и reverse(num). Дальше можно добавить обработку дробных чисел или больших целых с BigInt.
- Шаг 1:
© 2024 - 2026 ExLends, Inc. Все права защищены.