Как реализовать функцию, которая разбивает число на цифры, сортирует по убыванию и возвращает максимальное число
Что проверяют
Умение быстро разложить задачу на преобразования и увидеть края: отрицательные числа, ноль, очень большие значения. Следом спрашивают про сложность и про то, можно ли обойтись без строк.
Как отвечать
Базовое решение в одну строку: Number(String(n).split('').sort((a, b) => b - a).join('')). Проговорите шаги: число в строку, строку в массив символов, сортировка по убыванию, склейка и обратно в число. Сложность O(k log k), где k это количество цифр.
Дальше покажите, что думаете о краях:
- отрицательные числа:
String(-321)содержит минус, и сортировка сломается. Для отрицательного числа максимум получится, если цифры модуля отсортировать по возрастанию: из-321выйдет-123; - дробные числа: точка в строке тоже ломает сортировку. Уточните, допустим ли такой ввод, и явно отсеките его через
Number.isInteger; - большие числа: выше
Number.MAX_SAFE_INTEGER, то есть 9 007 199 254 740 991, точность теряется. Если входные данные длинные, принимайте строку илиBigIntи возвращайтеBigInt(result); - нули: при сортировке по убыванию они уходят в конец, поэтому
102превращается в210без сюрпризов.
Альтернатива без сортировки: подсчёт цифр в массиве из десяти счётчиков через n % 10 и Math.floor(n / 10), потом сборка результата от девятки к нулю. Это линейно по числу цифр и не создаёт промежуточных строк и массивов. Такой вариант стоит хотя бы упомянуть, даже если пишете первый.
Проверьте функцию на 0, 1001, -50 и числе из одинаковых цифр.
Где спотыкаются
Вызывают sort() без компаратора и называют это числовой сортировкой. По умолчанию сортировка строковая: на одиночных цифрах результат случайно совпадает, но на многозначных элементах уже нет, и [10, 9].sort() даёт [10, 9].
Забывают про минус. split даёт массив с '-', компаратор возвращает NaN, и порядок становится непредсказуемым.
Путают «максимальное число из цифр» с «максимальной цифрой» и возвращают Math.max(...digits). Формулировку лучше уточнить до того, как писать код.