高频面试算法典型题 - 02 整数反转

58 阅读1分钟

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

描述:如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123 输出:321 示例 2:

输入:x = -123 输出:-321 示例 3:

输入:x = 120 输出:21 示例 4:

输入:x = 0 输出:0  

提示:

-231 <= x <= 231 - 1

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

使用取模获得末尾数字

以12345为例,先拿到5,再拿到4,之后是3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。

我们不能用long存储最终结果,而且有些数字可能是合法范围内的数字,但是反转过来就超过范围了。 假设有1147483649这个数字,它是小于最大的32位整数2147483647的,但是将这个数字反转过来后就变成了9463847411,这就比最大的32位整数还要大了,这样的数字是没法存到int里面的,所以肯定要返回0(溢出了)。

所以我们需要提前判断

如果某个数字大于 214748364那后面就不用再判断了,肯定溢出了。 如果某个数字等于 214748364呢,这对应到上图中第三、第四、第五排的数字,需要要跟最大数的末尾数字比较,如果这个数字比7还大,说明溢出了。

对于负数也是一样的

public class ReverseInt {
    public int reverse(int x) {
        int res = 0;
        while(x != 0 ){
            // 每次取末尾数字
            int temp = x % 10;
            // 判断是否大于最大 32 位整数
            if (res > 214748364 || (res == 214748364 && temp > 7)) {
                return 0;
            }
            // 判断是否小于 最小 32 位整数
            if (res < -214738364 || (res == -214748364 && temp < -8)) {
                return 0;
            }
            res = res * 10 + temp;
            x /= 10;
        }
        return res;
    }
}