Переполнение в Java и почему Integer.MAX_VALUE / 10? - PullRequest
0 голосов
/ 06 июня 2019

Это код из решения Leetcode.Поэтому я не понимаю условия if, почему Integer.MAX_VALUE нужно делить на 10 (Interger.MAX_VALUE / 10)?

Спасибо!

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;
    }
}


Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Функция reverse(int x) инвертирует десятичные цифры x.Например, если x = 102, он возвращает 201, а если x = -102, он возвращает -201.

. Когда вычисляется обратное значение x, оно сохраняется в rev.Например, для x = 102, rev принимает последовательные значения 2, 20, 201.

. На каждой итерации rev умножается на 10 и одну цифру.добавляется к нему.Конечно, rev не может быть больше Integer.MAX_VALUE (2147483647).Таким образом, перед умножением rev на 10 мы проверяем, умножит ли его на 10 и добавит ли pop значение, превышающее Integer.MAX_VALUE.

Сначала мы проверим, больше ли revчем Integer.MAX_VALUE / 10 (214748364).Если оно больше, обратное целое число не существует.Если нет, то rev меньше или равно Integer.MAX_VALUE / 10.Если оно меньше Integer.MAX_VALUE / 10, то даже если мы умножим его на 10, мы можем добавить к нему любую цифру (pop), и мы не превысим Integer.MAX_VALUE.Однако, если оно равно Integer.MAX_VALUE / 10, то мы должны убедиться, что pop не равно > 7 (2147483647 - 214748364 * 10), поскольку в противном случае мы превысим Integer.MAX_VALUE.

.до Integer.MIN_VALUE (2147483648).

0 голосов
/ 06 июня 2019

Это довольно просто.Он в основном добавлен, чтобы вы не ударили целочисленную память из связанного исключения.

Line 1:   rev == Integer.MAX_VALUE / 10
Line 2:  rev = rev * 10 + pop;

Предположим, что приведенный выше случай верен для некоторого значения.Line 1 means that 10*rev = Integer.MAX_VALUE. Строка 2: rev - целое число.если в соответствии со строкой 1 мы столкнулись со случаем, когда rev = Integer.MAX_VALUE,, если мы добавим всплывающее окно поверх него, мы столкнемся с целочисленной памятью из связанного исключения.Чтобы избежать этого, добавлена ​​строка 1.Пример тестового примера, чтобы убедиться, что строка 1 выполнена: "Pass Integer.MAX_VALUE" as an input to reverse() function.

...