数学
直接用 long long 或者转换成字符串处理当然是能通过的,如果机器环境只支持 32 为整数,可以用数学方法判断. 如果不考虑溢出,代码可以这样写:
class Solution {
public:
int reverse(int x) {
int ans=0;
while(x){
int pop=x%10;
x/=10;
ans=ans*10+pop;
}
return ans;
}
};
不断从 x 中取出最低位,然后计入答案中. 现在的问题是如果在运行时,执行到 ans=ans*10+pop;
时发生了整数溢出,也就是 ans*10+pop
超出了 int 表示的范围,应该如何处理?
INT_MAX=2147483647 INT_MIN=-2147483648
,考虑所有溢出的情况:
- 若
ans*10+pop>INT_MAX
- 如果
ans*10>INT_MAX
,那么无论pop
值是多少,都会溢出,为了避免代码运行时溢出,可以移项后通过ans>INT_MAX/10
来进行判断. - 如果
ans*10<INT_MAX
但是ans*10+pop>INT_MAX
,说明是翻转后的最后一位数字(原来的第一位数字)造成了溢出,根据INT_MAX
的值,只要pop>7
就会发生溢出.
- 如果
- 若
ans*10+pop<INT_MIN
- 如果
ans*10<INT_MIN
,那么无论pop
值是多少,都会溢出,为了避免代码运行时溢出,可以移项后通过ans<INT_MIN/10
来进行判断. - 如果
ans*10>INT_MIN
但是ans*10+pop<INT_MIN
,说明是翻转后的最后一位数字(原来的第一位数字)造成了溢出,根据INT_MIN
的值,只要pop<-8
就会发生溢出.
- 如果
class Solution {
public:
int reverse(int x) {
int ans=0;
while(x){
int pop=x%10;
x/=10;
if(ans>INT_MAX/10 || (ans==INT_MAX/10 && pop>7)) return 0;
if(ans<INT_MIN/10 || (ans==INT_MIN/10 && pop<-8)) return 0;
ans=ans*10+pop;
}
return ans;
}
};
个人 LeetCode 代码仓库地址:MyLeetCode,记录刷题成长之路,欢迎各位小伙伴们多多 star ~