题目描述:
题目难度:简单
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
- 示例 1:
输入: 123
输出: 321 - 示例 2:
输入: -123
输出: -321 - 示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
笨办法:
该题比较简单,解题方法很直观。所谓笨办法,也就是第一反应的解法,没有经过细节的优化。
基本的思路是:记录下整数的正/负符号,对整数取绝对值。从低位到高位逐位左移,通过取余数得到整数的各个位,将各个位存入数组。利用数组中的数字v和索引i,就可以得到反转后的整数的各位。索引i处的数字v,对应反转后的整数位为v*10 **(l-i-1),其中l表示数组的长度。注意:不要忘记把正负符号加回来,以及对超过合法范围的情况的处理。
聪明办法:
参考官方提示,大体的思路基本与前述方法一致。但在细节处理上可以更加简单,比如根本就不需要用到数组。具体的处理步骤如下:
- 对于整数x,可先取绝对值abs(x),单独记录正负符号op,这样就只需要处理x为正数的情况。
- 通过以下算式得到反转后的整数ans,ans的初始值为0。
ans=ans*10+x%10
x=x//10
此算式的结束条件是x==0。 - 单独处理ans超过取值范围的情况,用16进制表示[−2^31, 2^31 − 1]较为方便。
return ans*op if ans<=0x7FFFFFFF else 0
笨办法:
用时40ms,此方法击败了30%的用户。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
s=[]#记录整数的各个位
op=1 if x>0 else -1#符号
n=abs(x)
hi,lo=2**31-1,-2**31
while n>0:
s.append(n%10)
n=n//10
# 注意符号
l=len(s)
res=0
for i,v in enumerate(s):
res=res+v*10**(l-i-1)
res=op*res
if res>=hi or res<=lo:
return 0
return res
聪明的方法:
同时也是简洁的方法,此方法用时36ms,击败了93%的用户。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
op=1 if x>0 else -1#符号
n=abs(x)
ans=0
while n>0:
ans=ans*10+n%10
n=n//10
return ans*op if ans<=0x7FFFFFFF else 0