class Solution:
def reverse(self, x: int) -> int:
# Limites de 32-bit signed integer
INT_MAX = 2**31 - 1 # 2147483647
INT_MIN = -2**31 # -2147483648
# Guardar o sinal e trabalhar com valor absoluto
sign = -1 if x < 0 else 1
x = abs(x)
# Reverter o número
result = 0
while x != 0:
digit = x % 10
x //= 10
# Verificar overflow ANTES de adicionar o dígito
# Se result > INT_MAX // 10, então result * 10 causaria overflow
if result > INT_MAX // 10:
return 0
# Se result == INT_MAX // 10, precisamos verificar o dígito
# Para INT_MAX = 2147483647, INT_MAX // 10 = 214748364
# Se estamos neste valor e o próximo dígito > 7, teremos overflow
if result == INT_MAX // 10:
# Para números positivos: verificar se dígito > 7
# Para números negativos: verificar se dígito > 8
if (sign == 1 and digit > 7) or (sign == -1 and digit > 8):
return 0
result = result * 10 + digit
return sign * result
# Testes
def test_solution():
sol = Solution()
# Casos do exemplo
print(f"reverse(123) = {sol.reverse(123)}") # Expected: 321
print(f"reverse(-123) = {sol.reverse(-123)}") # Expected: -321
print(f"reverse(120) = {sol.reverse(120)}") # Expected: 21
# Casos extremos
print(f"reverse(0) = {sol.reverse(0)}") # Expected: 0
print(f"reverse(1534236469) = {sol.reverse(1534236469)}") # Expected: 0 (overflow)
print(f"reverse(-2147483648) = {sol.reverse(-2147483648)}") # Expected: 0 (overflow)
print(f"reverse(2147483647) = {sol.reverse(2147483647)}") # Expected: 0 (overflow)
# Outros casos
print(f"reverse(1000) = {sol.reverse(1000)}") # Expected: 1
print(f"reverse(-1000) = {sol.reverse(-1000)}") # Expected: -1
if __name__ == "__main__":
test_solution()