7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 :
输入: 123
输出: 321
思路
通过 % 求余运算获取数字的最后一位,通过整数除法 /10 去掉最后一位,重复此操作直至数字变为 0,便可获取到数字的每一位。
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;
}
}
注意:溢出判断
- 如果 temp=rev * 10 + pop导致溢出,那么一定有 rev ≥ INTMAX/10。
- 如果 rev > INTMAX/10,那么 temp=rev * 10 + pop 一定会溢出。
- 如果 rev==INTMAX/10,那么只要 pop > 7,temp=rev⋅10+pop 就会溢出,因为INTMAX个位为7。
改进:
1、使用Long类型来接收结果。
2、因为int类型最大数和最小数开头的数字只能是1或2,所以如果有最后一次循环的话,pop的值一定为1或2,所以(rev == Integer.MAX_VALUE / 10 && pop > 7)和 (rev == Integer.MIN_VALUE / 10 && pop < -8)判断可以省略。