整数反转
题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231,231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路
在不借助额外的存储结构的情况下,可以使用数学的方式进行反转:
- 第一步,执行
x%10
可以得到x
的最后一位数字,也就是我们所得结果的第一位数字; - 第二步,执行
x=x/10
,由于x
自身是int
类型,运算完成之后,实际上是等同于将x
的最后一位舍弃,即对x
除法取整处理; - 第三步,执行
result = result * 10 + pop
就可以将每一位的数字进行反转。
由于需要考虑超出32
位时溢出的情况,那么,result = result * 10 + pop
在什么情况下溢出呢?result 为正值的情况下,如果result
大于Integer.MAX_VALUE / 10
,那么就一定会溢出,如果result
等于Integer.MAX_VALUE / 10
,那么,pop
如果大于Integer.MAX_VALUE % 10
也会产生溢出的情况。相反的,如果result
为负值,也是一样的原理:
public static int reverse(int x) {
int result = 0;
while (x != 0) {
// x % 10 可以取到 x 最后一位的值,即此时 pop 是 x 的最后一位,也就是新值的第一位
int pop = x % 10;
// x 的位数少了最后一位
x = x / 10;
// 由于后续运算 result = result * 10 + pop
// 如果 result 的值大于 Integer.MAX_VALUE / 10 ,那么一定会溢出
// 如果 result 的值等于 Integer.MAX_VALUE / 10,那么 pop 的值如果大于 Integer.MAX_VALUE % 10 也会溢出
// 相反的,result 的值小于 Integer.MIN_VALUE / 10 ,那么一定会溢出
// 如果 result 的值等于 Integer.MIN_VALUE / 10,那么 pop 的值如果小于于 Integer.MIN_VALUE % 10 也会溢出
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && pop > Integer.MAX_VALUE % 10)) {
result = 0;
return result;
} else if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && pop < Integer.MIN_VALUE % 10)) {
result = 0;
return result;
}
result = result * 10 + pop;
}
return result;
}