数学计算专项

182 阅读1分钟

整数翻转

题目

image.png

版本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) 注意如何判断翻转之后的数字会超出边界.