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; }
Обращение целого числа аналогично обращению строки. Мы получаем последнюю цифру x % 10
и добавьте его в rev
. Мы повторяем этот процесс до тех пор, пока x
не станет 0. Два оператора if используются для предотвращения переполнения целых чисел.
Временная сложность : O(журнал(x))
Дополнительное пространство : O(1)
Примечание о переполнении целых чисел
Целое число возникает, когда сумма rev * 10 + pop
больше/меньше максимального значения ( Целое число. МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ
)/минимальное значение ( Целое число. МИНИМАЛЬНОЕ ЗНАЧЕНИЕ
). Поэтому нам нужно проверить значения rev
и поп
.
- Если
rev > Целое число. МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ/10
илиrev <Целое число. Значение MIN_VALUE/10
,rev *10 + pop
переполнится. - Если
откр. Значение MAX_VALUE/10
,pop
должно быть меньше или равно 7, потому что2^32 - 1 % 10
. - Если
откр. Значение MIN_VALUE/10
,pop
должно быть больше или равно -8 потому что-2^32 % 10
.
Оригинал: “https://dev.to/algobot76/leetcode-7-reverse-integer-73j”