题目链接
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [−231,231−1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
- − 2 31 < = x < = 2 31 − 1 -2^{31} <= x <= 2^{31} - 1 −231<=x<=231−1
解题思路
算法框架:
初始化:给定有符号整数x,y=0(y记录x的倒序结果)。
while x!=0:
- 每次可以通过x%10的方式取到整数的最后一位。
- 每次可以通过y=y*10+x%10的方式更新y。
- x/=10
32位有符号整数的范围是 -2147483648 ~ +2147483647。
唯一需要注意的是数值溢出问题,一共有4种情况需要讨论:
- x<0
- y < -214748364时,下一次循环不管x%10等于几肯定会溢出。
- y == -214748364时,如果下一次的x%10<-8,那么肯定会溢出。
- x>=0
- y > 214748364时,下一次循环不管x%10等于几肯定会溢出。
- y == 214748364时,如果下一次的x%10>7,那么肯定会溢出。
解题代码
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int reverse(int x) {
int y=0;
while(x!=0){
int mo = x%10;
if(y>214748364 || (y==214748364 & mo>7)){
return 0;
}
if(y<-214748364 || (y==-214748364 & mo<-8)){
return 0;
}
y=y*10+mo;
x/=10;
}
return y;
}
};
int main(){
int x=-2147483412;
Solution so = Solution();
int y = so.reverse(x);
cout<<y<<endl;
return 0;
}