Вопрос:

Ссылка: https://leetcode.com/problems/reverse-integer/description/

Получив 32-битное целое число со знаком x, верните xс перевернутыми цифрами. Если обращение x приводит к тому, что значение выходит за пределы диапазона 32-разрядных целых чисел со знаком [-231, 231 - 1], возвращается 0.

Предположим, что среда не позволяет хранить 64-битные целые числа (со знаком или без знака).

Пример 1:

Input: x = 123
Output: 321

Пример 2:

Input: x = -123
Output: -321

Пример 3:

Input: x = 120
Output: 21

Ограничения:

  • -231 <= x <= 231 - 1

Решение:

Подход:

  1. Метод reverse принимает целое число x в качестве входных данных и возвращает обратное значение этого целого числа.
  2. Он инициализирует переменную rev значением 0, в котором будет храниться инвертированное целое число.
  3. В коде используется цикл while для обращения целого числа. Цикл продолжается до тех пор, пока x не станет равным 0, что означает, что все цифры обработаны.
  4. Внутри цикла код выполняет две операции:
  5. int pop = x % 10;: последняя цифра числа x вычисляется путем деления остатка на 10. x /= 10;: удаляется последняя цифра числа x путем деления на 10.
  6. Затем код проверяет, не приведет ли добавление цифры pop к rev к переполнению или потере значимости. Он сравнивает rev с максимальным и минимальным значениями, которые может содержать целое число (Integer.MAX_VALUE и Integer.MIN_VALUE соответственно), разделенными на 10. Если добавление pop вызовет переполнение или потерю значимости, метод возвращает 0.
  7. Если проверка проходит успешно, код обновляет rev, умножая его на 10 и добавляя цифру pop. Это эффективно добавляет цифру в текущей позиции к инвертированному целому числу.
  8. После завершения цикла while обратное целое сохраняется в rev и возвращается как результат.
class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}

Временная сложность: O(logN)

Космическая сложность: O(1)

Заключение:

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

Удачного кодирования.