007-整数反转
问题描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
这道题的难点在于如何判断溢出,即:如何判断问题描述当中加粗的那一部分文字
直接上代码,在代码中解释:
C#代码
public class Solution {
public int Reverse(int x) {
int _min = -(int)(Math.Pow(2,31));
int _max =(int) (Math.Pow(2,31) -1);
int ans = 0;
while(x != 0)
{
int temp = x%10;
//判断溢出部分
if(ans > _max/10 || (ans == _max/10&& temp > 7))
{
return 0;
}
if(ans < _min/10 ||(ans == _min/10 && temp < -8))
{
return 0;
}
ans = (ans*10 + temp); //计算反转数字
x = x/10;
}
return ans;
}
}
代码中已经标注出来的溢出部分
首先,我们一定要在计算反转数字之前,作溢出判断。如果先运算,那么有可能运算结果已经产生溢出,整个数就不对了。
既然在运算之前作判断,那么就得对下一次运算负责,这就是为什么_max, _min要先除以10的原因
Python代码
相同的思路,Python的代码就要简单许多,因为并不需要你去考虑溢出的问题,你只需做好一个范围判断就可以了
class Solution(object):
def reverse(self, x):
flag = 0
if x < 0:
flag = 1
x = -x
_max = 2**31 - 1
_min = -2**31
ans = 0
while x!=0:
t = x%10
ans = ans * 10 + t
x = x//10
if flag == 1:
return -ans if (-ans > _min) else 0
else:
return ans if ans < _max else 0