题目描述
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2**31, 2**31 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0.
int类型详解
使用python解题的话上述类型的话不用再考虑,也就是说,python解释器认为int类型不只有32位,所以在python中也就不存在溢出这个问题。因此python可以取巧,先将整数进行反转,然后判断反转之后的整数是否超越边界。
在其他的编程语言中,int一般被规定为32位有符号整数,因此,其所能表示的最大范围是被限定的,32位中第一位被拿来做符号位,只有剩下的31位能够表示数据。
因此,int类型下最大的数据表示为2147483647
=2^31-1
。其原码、反码、补码都相同如下:0111 1111 1111 1111 1111 1111 1111 1111
因为32位中有一位符号位,因此只有31位能表示数据,那么好像
int的最小数值就应该是-2147483647
=-2^31-1
。其原码、反码、补码如下原码为1111 1111 1111 1111 1111 1111 1111 1111,
反码为1000 0000 0000 0000 0000 0000 0000 0000,
补码为1000 0000 0000 0000 0000 0000 0000 0001
所以最小的负数是-2147483647吗?错,不是。
在二进制中,0有两种表方法。
+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,
-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,
因为0只需要一个,所以把-0拿来当做一个最小的数-2147483648。
-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。
注意,这个补码并不是真正的补码,真正的补码是1 1000 0000 0000 0000 0000 0000 0000 0000,溢出。
所以带符号32位int类型整数为-2147483648~2147483647
解题代码
class Solution:
def reverse(self, x):
reverse_num=int(str(abs(x))[::-1])
if reverse_num.bit_length() > 31:
return 0
else:
return reverse_num if x > 0 else -reverse_num