题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解答思路
基本思路是从输入的整数A中取出最低位数An,接着A整体右移一位数(10进制),而在另一处空间的数T整体左移一位数(10进制),然后将取出的数An添加到数T的最后一位Tn。如此循环直到A变成0。从而形成整数反转。
- 细节和优化:
- 因为存在正负数,所以当输入是负数时,取绝对值。
- 因为存在溢出,所以当反转后的绝对值大于231(正数是大于231− 1)时,视为溢出,返回0。
- 因为只有当A是10位数的时候才可能发生溢出,所以只要在第10次循环后进行判断是否溢出即可。从而减少了运行判断时间。
具体代码
- C语言
int reverse(int x){
int flag=0, i=0;
long value=(long) x;
long y=0;
long MAX=2147483648;
if(x==0){return 0;}
if(x < 0){
flag = 1;
value = -value;
}else{
flag = 0;
}
for(i=0; i<10 && value!=0; i++,value /= 10){
y *= 10;
y += (value%10);
}
if(flag==1){
if(y > MAX){return 0;}
y=-y;
}else{
if(y > (MAX-1)){return 0;}
}
return (int)y;
}