一、题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
二、题目分析
题目注意点,不能超出范围 [−231, 231 − 1]。如果反转后整数溢出那么就返回 0。
1.python3方法
首先利用字符串函数str,将数字转化为字符串x2str,这样通过len函数统计出数字的长度,如果长度大于32,既可直接返回0。然后建立空的哈希表haxi,通过字符串x2str的首字符判断整数是正数还是负数,然后通过第一个循环把字符x2str字符赋值到哈希表中。通过第二个循环把哈希表中倒序的元素取出并赋值给字符串a(最后把该字符串转化为整数即可),最后需要对倒序的整数进行检测,判断是否出现的倒序后溢出的现象。
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
x2str=str(x)
if len(x2str) <= 32:
haxi={}
a=''
if x2str[0] == '-':
haxi[0] = '-'
for i in range(1,len(x2str)):
haxi[i] = x2str[len(x2str) - i]
else:
for i in range(len(x2str)):
haxi[i]=x2str[len(x2str)-1 - i]
for i in haxi.values():
a=a+str(i)
if (int(a) >= -2**31) and (int(a) <= (2**31-1)):
return int(a)
else:
return 0
else:
return 0
python3耗时:76ms
2.官网答案分析
以上算法解释:
1.INTMAX代表正数最大值:231-1,INTMIN代表负数最小值:-231。
2.X是正数:如果rev迭代使得rev*10 > INTMAX,即temp=rev 10 +pop不满足等式,一定会溢出。由于2**31-1==2147483647,即如果rev10 == INTMAX=214748364时,而且末尾数字pop > 7 时,则一定会溢出。
3.X是负数:如果rev迭代使得rev*10 < INTMIN,即temp=rev 10 +pop不满足等式,一定会溢出。由于-2**31==-2147483648,即如果rev10 == INTMIN=214748364时,而且末尾数字pop < -8 时,则一定会溢出。(**注意:**负数在c++求余数只有依旧为负数,所以temp和rev都是负数,最后得到的也是负数,所以不用考虑负号)
官网c++实现:
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
};
c++耗时20ms
Python3实现:
通过模仿c++之后,负数检测出错,所以在python3中加入判断是否为负数的判断,即可转化为正数,和整数操作一样,但最后返回值时加负号:
class Solution:
def reverse(self,x):
rev=0
INTMAX=2**31-1
INTMIN=-2**31
if x>=0:
while(x != 0):
pop = x % 10
x = int(x / 10)
if( rev>int(INTMAX/10) or ( rev == int(INTMAX/10) and pop > 7) ):
return 0
if( rev < int(INTMIN/10) or ( rev == int(INTMIN/10) and pop < -8) ):
return 0
rev =rev*10 +pop
return rev
else:
x=-x
while (x != 0):
pop = x % 10
x = int(x / 10)
if (rev > int(INTMAX / 10) or (rev == int(INTMAX / 10) and pop > 7)):
return 0
if (rev < int(INTMIN / 10) or (rev == int(INTMIN / 10) and pop < -8)):
return 0
rev = rev * 10 + pop
return -rev
python3耗时:72ms
注意点:
1.字典运算:
在字典值中循环:for i in haxi.values();
在字典键中循环用:for i in haxi.keys();
获取字典值:haxi1.get(键),或者haxi1[键]。
2.注意判断逻辑:第一个中的正数和负数判断以及赋值都不同。
3.注意231,在python中应该是:2**31。
4.python中求余数和除法:
除法为’ / ',结果是浮点型,所以需要加int转化。求余数用 ‘ % ’。