«Обратная целочисленная задача» — это вопрос на собеседовании по разработке программного обеспечения, который обычно используется в процессе найма некоторыми из крупнейших компаний мира, включая 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. Давайте посмотрим на окончательное решение!