题目:
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
题目分析:
C语言中:
int类型在C语言中占4个字节,即32个二进制位。C语言中int的取值范围为:-2147483648 ~ 2147483647
如果我们要翻转 1000000009 这个在范围内的数得到 9000000001,而翻转后的数就超过了范围。
所以,我一开始的想法是定义一个long long型数据来存储翻转后的数据,这样就不会溢出。
但参考网上的一些代码后,我发现并不需要这样做,这里就涉及到了一个非常重要的技巧:边翻转边检测,一旦超出INT_MAX停止后续翻转,并返回0。这样做的好处是:1.减少了一些不必要的无意义的计算。2.免于定义long long类型数据
数字的翻转还用到了常用的数字从低位到高位的分离算法。
C解答:
int reverse(int x) {
int res=0;
while(x!=0){
if(abs(res)>INT_MAX/10) return 0;
res=res*10+x%10;
x /= 10;
}
return res;
}
Python中:
注意Python中的int的范围:
2.7:
32位:-2^31~2^31-1 64位:-2^63~2^63-1
3.5:
在3.5中int长度理论上是无限的
此外:
在python中:
/是精确除法,//是向下取整除法,%是求模
%求模是基于向下取整除法规则的
C中:
/是向零取整除法
%是向零取整求模
什么是向下取整?
看看下面python运算示例就明白了:
基于上面两点,我们可以按照C解答中算法写出如下代码:
Python解答:
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
res=0
signal=0
if x<0:
x=-x
signal=1
while x!=0:
if res>(pow(2,31)/10):
return 0
res=res*10+x%10
x=x//10
if signal==1:
return -res
else:
return res