Перейти к основному содержимому

Обратное число в Java

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

В этом уроке мы увидим, как инвертировать число, используя математический подход в Java. Сначала мы увидим, какие математические операции необходимы для этого, а затем рассмотрим три различных способа реализации.

2. Подход к решению

Для начала давайте возьмем пример и посмотрим, что именно должно произойти. Например, мы хотим, чтобы число 1234 стало 4321. Этого можно добиться с помощью следующего подхода:

  1. получить последнюю цифру числа
  • мы можем применить модуль, чтобы получить последнюю цифру
  • 1-я итерация – 1234 % 10 = 4
  • 2-я итерация – 123 % 10 = 3
  1. умножьте обратное число на 10 и добавьте цифру, найденную на предыдущем шаге
  • 1-я итерация — 0 * 10 + 4 = 4 (поскольку для начала нет перевернутого числа, мы умножаем на 0 в 1-й итерации)
  • 2-я итерация – 4*10+3=43
  1. разделите исходное число на 10 и повторите с шага 1 и продолжайте, пока число не станет 0
  • 1-я итерация — 1234/10 = 123
  • 2-я итерация – 123/10=12

3. Математическая реализация

Мы хотим перевести математические операции выше в код. Это возможно тремя различными способами: с помощью цикла while , цикла for или рекурсии.

Приведенные ниже подходы также учитывают отрицательные значения, используя абсолютное значение числа, которое необходимо обратить, и умножив обращенное число на -1, если исходное число отрицательное.

3.1. пока цикл

Цикл while находится первым в списке, так как это самый понятный способ перевода математических операций выше:

int reversedNumber = 0;
int numberToReverse = Math.abs(number);

while (numberToReverse > 0) {
int mod = numberToReverse % 10;
reversedNumber = reversedNumber * 10 + mod;
numberToReverse /= 10;
}

return number < 0 ? reversedNumber * -1 : reversedNumber;

3.2. для цикла

При использовании цикла for логика такая же, как и раньше. Мы пропускаем оператор инициализации цикла for и используем число, которое переворачивается в завершающем условии:

int reversedNumber = 0;
int numberToReverse = Math.abs(number);

for (; numberToReverse > 0; numberToReverse /= 10) {
int mod = numberToReverse % 10;
reversedNumber = reversedNumber * 10 + mod;
}

return number < 0 ? reversedNumber * -1 : reversedNumber;

3.3. Рекурсия

Для рекурсии мы можем использовать метод-оболочку, который вызывает рекурсивный метод, возвращающий перевернутое число:

int reverseNumberRecWrapper(int number) {
int output = reverseNumberRec(Math.abs(number), 0);
return number < 0 ? output * -1 : output;
}

Метод рекурсии реализует математические операции так же, как и в предыдущих примерах:

int reverseNumberRec(int numberToReverse, int recursiveReversedNumber) {

if (numberToReverse > 0) {
int mod = numberToReverse % 10;
recursiveReversedNumber = recursiveReversedNumber * 10 + mod;
numberToReverse /= 10;
return reverseNumberRec(numberToReverse, recursiveReversedNumber);
}

return recursiveReversedNumber;
}

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

4. Вывод

В этой статье мы рассмотрели три различных реализации обращения числа с использованием цикла while , цикла for и рекурсии.

Как всегда, исходный код примеров доступен на GitHub .