Проверка на целочисленное переполнение не работает с использованием Python

#python #algorithm

#python #алгоритм

Вопрос:

Я работаю над проблемой кодирования, когда мне нужно перевернуть целое число. Если целое число имеет только 1 цифру, я возвращаю целое число таким, какое оно есть. Если оно меньше нуля, я переворачиваю его, но оставляю знак нетронутым. Я должен проверить переполнение целого числа , чтобы убедиться , что оно находится в диапазоне [−231, 231 − 1] . Ниже приведен мой код:

 def reverse(self, x: int) -> int:
    
    if x >=0 and x <= 9:
        return x
    
    elif x > 9 and x < (2**31):
        rever1 =  str(x)[::-1]
        return int(rever1)
    
    elif x < 0 and x > (-2**31):
        rever2 = str(x)[::-1]
        rever2 = rever2[:-1]
        rever2 = -1  * int(rever2)
        return rever2
    
    elif x <= (-2**31) or x >= (2**31):
        return 0
 

Я знаю, как сделать этот код короче, так что с неэффективностью пока все в порядке. Я просто хочу знать, почему мой код терпит неудачу 1534236469 .

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

Комментарии:

1. Что такое self ?

2. Может ли это быть связано с тем, что перевернутое целое число будет больше 2**31-1 ?

3. @Stef, вот как отвечает Leetcode structures. Это должен быть метод класса Solution .

Ответ №1:

Вы проверяете входное значение, а не возвращаемое значение. Приведенный вами тестовый пример — это класс «problem»: входное число находится в диапазоне, а обратное — нет.

Вам также необходимо проверить rever1 , находится ли он в диапазоне:

 elif x > 9 and x < (2**31):
    rever1 = str(x)[::-1]
    return int(rever1)
 

Может быть

 elif x > 9 and x < (2**31):
    rever1 = str(x)[::-1]
    if rever1 < (2**31):
        return int(rever1)
    else:
        return 0
 

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