给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
1.简单解法
1.判断x的大小,对于负值将其转化为正值,待其反转后再将再填负号
2.将整数转化为字符串
3.通过[::-1]进行反转
4.范围认定,注意:要求的是reverse之后再进行判断而不是之前的x值是否在范围中。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x==0:
return x
if x<0:
x=-x
str_x=str(x)
str_x=str_x[::-1]
x=int(str_x)
x=-x
if x<=-2**31:
return 0
else:
return x
if x>0:
str_x=str(x)
str_x=str_x[::-1]
x=int(str_x)
if x>=2**31-1:
return 0
else:
return x
2.优化解法
1.将x的绝对值存入y
2.反复“弹出”y的最后一位,将其”推入“res的后面
3.在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
y,res=abs(x),0
boundary=1<<31 if x<0 else (1<<31)-1
while y!=0:
res=res*10+y%10
if res>boundary:
return 0
y//=10
return res if x>0 else -res
python中的左移和右移:
左移、右移是指:在二进制中,将1向左、向右移动的位数,返回的是将二进制数转换为十进制数的结果。
公式: a<<b 等价于 a*(1<<b),而(1<<b)的结果是二进制数: 100…00 (共b个0,表示将1向左移动b位),对应的十进制结果是:2^{b}
示例: 3<<5 = 3*2^{5} = 96
使用左移右移操作,可以提升计算速度。