描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1
输入: 123 输出: 321
示例2
输入: -123 输出: -321
示例3
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
难点:
1. 如何取每位数字
2. 如何判断越界
实现思路
对于每位数字的获取,从后往前依次获取,直到全部取完,另外转换为字符串一个一个获取方法虽然方面,但是不建议。在越界判断方面,一种思路是转换为long,反转后和int类型的边界比较,相当于升维了,方法简单,但是牺牲了内存,简单的场景用这种思路还是可以的,另一种思路是,在拼凑反转数字还剩一位时去判断有没有越界的可能,详见第一份代码。
实现代码1
int reverse(int x) {
int ans = 0;
while (x != 0)
{
int pop = x % 10;
if (ans > INT_MAX / 10 || (ans == INT_MAX / 10 && pop > 7))
{
return 0;
} else if (ans < INT_MIN / 10 || (ans == INT_MIN / 10 && pop < -8))
{
return 0;
}
ans = ans * 10 + pop;
x = x / 10;
}
return ans;
}
实现代码2
long msbNum(long xx){
long num = 1, res = 0;
while(num * 10 <= xx){
num *= 10;
}
return num;
}
long getRes(long xx){
long res = 0;
long divide = msbNum(xx), mul = 1;
//cout << divide << endl;
while(divide > 0){
res += (xx/divide) * mul;
xx -= (xx/divide)*divide;
mul *= 10; divide /=10;
}
return res;
}
int reverse(int x) {
int sign = x > 0? 1: -1;
long xx = long(x) * sign;
long res = getRes(xx);
//cout << res << endl;
res *= sign;
if(sign > 0){
return res > INT_MAX? 0: res;
}else{
return res < INT_MIN? 0: res;
}
return 0;
}