题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围\([-2^{31},2^{31}-1]\),就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:\(x\in[-2^{31},2^{31}-1]\)
这道题目比较简单,首先思考把每一位数都存储起来,然后进行反转求和,就可以得到答案。
第一版代码
int reverse(int x) {
char rev[50];
int i=0,num=0,ans=0;
while(x!=0){
rev[num]=x%10;//使用数组记录每一位
x=x/10;
num=num+1;//用num记录位数大小
}
for(i=0;i<num;i++){
ans=ans*10+rev[i];//复原该数
}
return ans;
}
1.在代码完成中有一些tips需要注意:%表示求余数,在负数求余数时会得到负余数,例如:
cout << -21 % -5 << endl;//将会输出-1
cout << -21 % 5 << endl;//将会输出-1
cout << 21 % -5 << endl;//将会输出1
2. 没有必要写成两个for循环,因为前面的最后以为刚好是反转后数的第一位,需要不断的乘10.
第二版代码
int reverse(int x) {
int i=0,num,ans=0;//不需要进行存储数组,直接进行求和
while(x!=0){
num=x%10;
x=x/10;
ans=ans*10+num;
}
return ans;
}
但是这个题目有一个需要注意的地方,就是当题目这个数反转会溢出时,需要返回0。所以在求和的时候需要多一步判断是否溢出:
ans为正数时:如果ans>INT_MAX/10,则返回0,如果ans==INT_MAX/10,当num大于INT_MAX的最后一位就会上溢出。
ans为负数时:如果ans<INT_MIN/10,则返回0,如果ans==INT_MIN/10,当num小于INT_MIN的最后一位就会下溢出。
答案
int reverse(int x) {
int i=0,num,ans=0;
while(x!=0){
num=x%10;
x=x/10;
if(ans>INT_MAX/10||(ans==INT_MAX/10&&num>INT_MAX%10)){
return 0;//加上这两句判断语句即可
}else if(ans<INT_MIN/10||(ans==INT_MIN/10&&num<INT_MIN%10)){
return 0;
}
ans=ans*10+num;
}
return ans;
}