题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
解题思路
首先,最直接的想法是:利用对10取余和整除,从右到左把每一位数提取出来,再重新拼接成我们需要的反转形式。
1234
取余:1234%10=4
整除:1234/10=123
拼接:4
取余:123%10=3
整除:123/10=12
拼接:4*10+3=43
取余:12%10=2
整除:12/10=1
拼接:43*10+2=432
取余:1%10=1
整除:1/10=0
拼接:432*10+1=4321
可以看到,当整除的结果为0的时候,应该停下,此时也得到了我们想要的结果4321。
对于负数和末尾带0的情况,以上的思路一样适用,可以自行验证。
那么接下来就要考虑题目的额外要求:反转后的数值范围 [−231, 231 − 1],上溢或下溢时返回0。
上下限具体数值为:
-231 = - 2147483648
231-1 = 2147483647
我们要做的就是判断结果是否处于范围内,直接用if语句即可完成。但是这里有一个陷阱,如果你在最后才判断结果是否符合范围,在运行过程中就会溢出导致错误,因为int本身就不能存储太大的数值,而如果使用long int,未免又有作弊的嫌疑,因此我们需要在转换的过程中就进行判断,如果不符合,直接返回0
下面直接给出运行代码。
运行代码
int reverse(int x) {
int min = - 2147483648;
int max = 2147483647;
int result = 0, t=0;
int num = x;
while(num != 0){
t = num%10; //取余
num = num/10; //整除
if(result<min/10 || result==min/10 && t<-8){ //判断下溢
return 0;}
if(result>max/10 || result==max/10 && t>7){ //判断上溢
return 0;
}
result = result*10 + t; //拼接
}
return result;
}