«Обратная целочисленная задача» — это вопрос на собеседовании по разработке программного обеспечения, который обычно используется в процессе найма некоторыми из крупнейших компаний мира, включая Google, Adobe, Bloomberg и Microsoft.

Проблема обманчиво проста. Это часто читается как некоторая вариация: «Дано целое число, вернуть целое число в обратном порядке».

Просто, верно?

Внезапно вы можете подумать о простом решении, в котором вы создадите массив из входного целого числа, вызовете методы .reverse(), а затем .join(), которые перевернут массив, а затем соединит его обратно в строку, где вы Затем можно вызвать the Number() method, чтобы вернуть обратное целое число.

let integer = 123;
return Number(Array.from(integer.toString()).reverse().join(''));

но если бы это было так просто, мы бы все сейчас работали в Google. Проблема связана с оговоркой в ​​виде очень простого ограничения; Вы не можете преобразовать целое число, изменив его на строку или массив, и в коде решения разрешены только математические и целые числа.

Yikes, эта проблема только что стала намного сложнее. Как же тогда мы можем обратить число, используя только javascript и математику?

Ответ на самом деле довольно элегантный.

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

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

Шаг первый: IOCE!
С какими входными и выходными данными, ограничениями и/или пограничными случаями мы работаем?

Шаг второй: диаграмма
Теперь, когда мы понимаем наши входные данные, выходные данные, ограничения и пограничные случаи, мы можем начать визуализировать то, как мы хотим, чтобы наши данные вели себя, чтобы получить запрошенный результат.

Шаг третий: Преобразование в код
Итак, диаграмма выглядит красиво и все такое, но как мы должны превратить ее в javascript, не изменяя входное целое число в строку или массив? Если мы посмотрим немного ближе, ответ начнет раскрываться сам собой.

Если мы подумаем о верхней строке как о цикле while, мы можем начать понимать ее как…

«пока входное целое число больше или равно единице…»

while (number >= 1) {
  // do things
};

Затем нам нужно будет подумать, что мы будем делать в цикле while, чтобы изменить ввод «123» на «12» на «1» и каждый раз удерживать этот последний элемент. Мы должны посмотреть, есть ли какие-либо основные математические операции, которые могли бы помочь.

Внимательный наблюдатель может заметить, что (123/10) на самом деле не равно 12, как следует из диаграммы, а вместо этого дает не столь полезное значение, 12,3. К счастью, в javascript есть метод именно для этой цели. Math.floor() проигнорирует любые десятичные разряды и вернет наибольшее целое число, меньшее или равное заданному числу. В этом случае, превращая бесполезные 12,3 в очень полезные 12.

А что насчет другого оператора? input % 10 глиф процента называется оператором по модулю, иногда его называют оператором остатка, и его можно прочитать как наибольшее оставшееся значение после деления ввода на 10 или, выражаясь более кратко. Modulo можно рассматривать как выполнение следующего;

let input = 123
input = Math.ceil(input / 10) // 13 (12.3 rounded up)
return (input - 10) // returns 3

Наконец, результат нашей операции по модулю умножается на десять и добавляется к результату следующего прохода. (например, (3 x 10) +2, затем (32 x 10) + 1)

Итак, подход, который мы будем использовать, включает в себя умножение, деление, оператор по модулю (или остатку) и цикл while. Давайте посмотрим на окончательное решение!