题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转.
示例 1
输入: 123
输出: 321
示例 2
输入: -123
输出: -321
示例 3
输入: 120
输出: 21
注意
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [ − 2 31 {-2^{31}} −231, 2 31 − 1 {2^{31}}-1 231−1]. 请根据这个假设,如果反转后整数溢出那么就返回 0 .
解题思路
可以一次构建反转整数的一位数字. 在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出.
反转整数的方法可以与反转字符串进行类比.
我们想重复"弹出" x 的最后一位数字,并将它"推入"到 rev \text{rev} rev 的后面. 最后, rev \text{rev} rev 将与 x 相反.
在没有 辅助堆栈/数组 的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法.
//pop operation:
pop = x % 10;
x /= 10;
//push operation:
temp = rev * 10 + pop;
rev = temp;
但是,这种方法很危险,因为当 temp = rev ⋅ 10 + pop \text{temp} = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop 时会导致溢出.
所以,必须事先检查这个语句是否会导致溢出很容易.
- rev \text{rev} rev 是正数
- 如果 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop 导致溢出,那么一定有 rev ≥ I N T M A X 10 \text{rev} \geq \frac{INTMAX}{10} rev≥10INTMAX .
- 如果 rev > I N T M A X 10 \text{rev} > \frac{INTMAX}{10} rev>10INTMAX ,那么 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop 一定会溢出.
- 如果 rev = = I N T M A X 10 \text{rev} == \frac{INTMAX}{10} rev==10INTMAX ,那么只要 pop > 7 \text{pop} > 7 pop>7 , t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop.
- rev \text{rev} rev 是负数
- 如果 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop 导致溢出,那么一定有 rev ≤ I N T M I N 10 \text{rev} \leq \frac{INTMIN}{10} rev≤10INTMIN .
- 如果 rev < I N T M I N 10 \text{rev} < \frac{INTMIN}{10} rev<10INTMIN ,那么 t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop 一定会溢出.
- 如果 rev = = I N T M I N 10 \text{rev} == \frac{INTMIN}{10} rev==10INTMIN ,那么只要 pop < − 8 \text{pop} < -8 pop<−8 , t e m p = rev ⋅ 10 + pop temp = \text{rev} \cdot 10 + \text{pop} temp=rev⋅10+pop .
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) {
return 0;
}
if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) {
return 0;
}
rev = rev * 10 + pop;
}
return rev;
}
}