【LeetCode】7.Reverse Integer


1 问题

Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-$2^{31}$, $2^{31}$ - 1]`, then return 0.

Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

1.1 Example 1

Input: x = 123
Output: 321

1.2 Example 2

Input: x = -123
Output: -321

1.3 Example 3

Input: x = 120
Output: 21

提示

  • -$2^{31}$ <= x <= $2^{31}$ - 1

2 解题思路

2.1 解法一

利用StringBuilderreverse()方法,实现逆转。因题目要求不能用其他大数据类型存储整数,又Integer.MAX_VALUE为10位整数,所以当逆转过程中的数字位数超过10位时,需要比较高5位,低5位对应值分别于2147483647的大小,只要有一个结果是大于,则返回0;否则,继续遍历该数的下一位。

详见代码中的解法一。

2.2 除取余

同解法一比较思想,只是这里是通过除取余,按位逆转,当中间值res>Integer.MAX_VALUE / 10,返回0;否则,继续除取余。

详见代码中的解法二。

3 代码

class Solution {
    // 解法一:StringBuilder.reverse
    public int reverse2(int x) {
        StringBuilder sb = new StringBuilder();
        String res = sb.append(Math.abs(x)).reverse().toString();
        // Integer.MIN_VALUE=-2147483648
        // Integer.MAX_VALUE=2147483647
        if (res.length() >= 10) {
            if (Integer.parseInt(res.substring(0, 5)) > 21474 || Integer.parseInt(res.substring(5, 10)) > 83647) {
                return 0;
            }
        }
        int num = Integer.parseInt(res);
        return x < 0 ? -1 * num : num;
    }

    // 解法二:%,除取余
    public int reverse(int x) {
        boolean minusFlag = x < 0;
        int originalX = x;
        if (minusFlag) {
            originalX = -1 * x;
        }
        int res = 0;
        int modNum;
        while (originalX > 0) {
            modNum = originalX % 10;
            //ouside the range of [-2^31,2^31-1]
            if (res > Integer.MAX_VALUE / 10) {
                return 0;
            }

            res = res * 10 + modNum;
            originalX /= 10;
        }
        return minusFlag ? -1 * res : res;
    }
}

文章作者: Kezade
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kezade !
评论
  目录