如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
题源:https://leetcode-cn.com/problems/reverse-integer/
问题描述:整数翻转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路:
整数翻转的不难,主要是在整数是否溢出。
整数翻转的方法:
int sum=0;
while(x!=0){
int a=x%10;
x=x/10;
sum=sum*10+a;
}
现在给出两种判断sum是否溢出的方法。
方法一:
将sum
的类型改为long
,在循环后加入下列代码进行判断。
if((int)sum!=sum){
return 0;
}
代码实现
int reverse(int x){
long sum=0;
for(;x!=0;){
int a=x%10;
x=x/10;
sum=sum*10+a;
}
if((int)sum!=sum){
return 0;
}
return (int)sum;
}
方法二:
通过上述翻转代码可以看出sum=sum*10+a
这句话会产生溢出,为了方便表达,将此句改为
temp=sum*10+a;
sum=temp;
如果temp=sum*10+a
导致溢出,
上限溢出:
(1)如果sum>INT_MAX/10
,temp=sum*10+a
一定会溢出。
(2)如果sum=INT_MAX/10
,且a>7
,一定会溢出。
下限溢出:(此时为负数)
(1)如果sum<INT_MIN/10
,temp=sum*10+a
一定会溢出。
(2)如果sum=INT_MIN/10
,a<-8
,一定会溢出。
代码实现
int reverse(int x){
int sum=0;
for(;x!=0;){
int a=x%10;
x=x/10;
if (sum > INT_MAX/10 || (sum == INT_MAX / 10 && a > 7)) return 0;
if (sum < INT_MIN/10 || (sum == INT_MIN / 10 && a < -8)) return 0;
sum=sum*10+a;
}
return (int)sum;
}