LeetCode-整数反转

263 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

题目

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

  • 示例 1:

输入:x = 123 输出:321

  • 示例 2:

输入:x = -123 输出:-321

  • 示例 3:

输入:x = 120 输出:21

  • 示例 4:

输入:x = 0 输出:0

提示:

-2^31 <= x <= 2^31 - 1

解题思路:

  • 把整数从个位数往首位逐个取出(从右->左),首先要了解的就是两种运算符
  1. 求余 % :求余能够获取整数个位数的数值 (x%10)
  2. 除法 / :除以10能够把整数的个位数向左偏移一位(x/10)
  • 准备个箱子n,把逐个取出的个位数放到箱子中,个位数放到箱子时,首先要把箱子中可能存在的整数向左偏移,留出末位来放个位数(n*10),然后再加上个位数(也就是整数求余的值 x%10) 难点:溢出问题
解法一:

若忽略假设,那么执行过程中先定义一个比假设(n的类型为int)更大的箱子n的类型为long,在返回结果是强制转换把类型为long箱子的数据塞进类型为int的箱子,放不进去则代表溢出,反馈0,能放进去则说明没有溢出,返回转换好的类型 实现

    public int reverse(int x) {
        long n = 0;
        while(x != 0){
            n = n*10 + x%10;
            x = x/10;
        }
        return (int)n==n?(int)n:0;
    }
}
解法二:

根据官方正确解法,溢出问题需要根据公式推导: 先假设输入值x大于0的情况,然后进行除以10(/10)以及模10(%10)进行分解(分解的思路小编暂时不知道),最后结果就是上文中的箱子n小于或等于(2^31-1)/10,不等式成立 同理再考虑x小于0的情况,最后箱子的限制范围为:-2^31/10 < n < (2^31-1)/10 实现

    public int reverse(int x) {
        int n = 0;
        while (x != 0) {
            if (n < Integer.MIN_VALUE / 10 || n > Integer.MAX_VALUE / 10) {
                return 0;
            }
            n = n*10 + x%10;
            x /= 10;
        }
        return n;
    }
}