给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^(31) − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路:
- 32 位的有符号整数数值范围为[-2 147 483 648,2 147 483 647],JAVA语言可以使用[
Integer.MIN_VALUES
,Integer.MAX_VALUES
]来判断是否超出数值范围。 - 可以考虑用数学的方法,如将输入值每次进行个位取余,然后加到结果上,
- 例如:123
- result = 0
- result = result*10 + 123%10
- result = 3
- 123/10=12
- result = result *10 + 12%10
- result = 32
- 12/10=1
- result = result*10 + 1
- result = 321
- 上述算法在接近[
Integer.MIN_VALUES
,Integer.MAX_VALUES
]时要额外注意,因为即使在一开始已经添加if
语句将传入时已经越界的数值x
排除,但由于x
在靠近边界值时反转也会出现越界的情况,所以在计算result
时要判断是否越界。
代码实现:
public int reverse(int x) {
if(x>Integer.MAX_VALUE || x<Integer.MIN_VALUE) {
return 0;
}
int result = 0;
for(int i = 0;x!=0;) {
i = x%10;
x = x/10;
if(result>(Integer.MAX_VALUE/10) || (i>7 && result==(Integer.MAX_VALUE/10))) {
return 0;
}
if(result<(Integer.MIN_VALUE/10) || (i<-8 && result==(Integer.MIN_VALUE/10))) {
return 0;
}
result = result*10 + i;
}
return result;
}