整数翻转
题目
版本1 正确
public static int reverse(int x) {
// int的取值范围, -2147483648 ~ 2147483647
int ans = 0;
while (x != 0) {
// 这里无需考虑x的正负的问题, 当x是负数的时候, 计算得到的余数p也是负数
// 因此负数得到的结果自然就是负数
int p = x % 10;
x = x / 10;
// 需要对x是否是边界值进行判断, 例如2147483647翻转完成后, 应该是7463847412
// 明显超出了int的数据范围, 得到的就会是一个负数(本身是个正数)
// 我每次计算完的结果是ans * 10 + p, 因此只要ans * 10 + p在int范围内就可以
// 但是这里不能用ans * 10, 因为乘完之后就有可能超出int范围了
// 因此转化成ans > Integer.MAX_VALUE / 10, 因为p只会是一位数, 因此如果是大于不用管p
// 或者ans == Integer.MAX_VALUE && p > 7. (7是因为int的最大值最后一位是7)
if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && p > 7)) {
return 0;
}
// 针对负数
if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && p < -8)) {
return 0;
}
ans = ans * 10 + p;
}
return ans;
}
正确的原因
(1) 注意基础写法如何写, 即非边界情况, ans = ans * 10 + p;
(2) 注意如何判断翻转之后的数字会超出边界.