『LeetCode』7. 整数反转 Reverse Integer

发布时间 2023-12-24 16:45:30作者: 北岛孤影

题目描述

给你一个 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

题目链接https://leetcode.cn/problems/reverse-integer/

『1』数学方法(模拟法)

解题思路

rev为翻转后的数字,为完成翻转,可以重复弹出x的末尾数字,将其推入rev的末尾,直至x0
注意该过程中若溢出则直接return 0
要在没有辅助栈或数组的帮助下「弹出」和「推入」数字,我们可以使用如下数学方法:

// 弹出 x 的末尾数字 digit
digit = x % 10
x /= 10
// 将数字 digit 推入 rev 末尾
rev = rev * 10 + digit

实现代码

class Solution {
    // Simulation
    // N is the number of digits in the number x
    // Time Complexity: O(log(N))
    // Space Complexity: O(1)
    public int reverse(int x) {
        if (x < 10 && x > -10) return x;

        int rev = 0;
        while (x != 0) {
            // rev = rev * 10 + x % 10 > Integer.MAX_VALUE
            // ==> rev > (Integer.MAX_VALUE - x % 10) / 10
            if (x > 0 && rev > (Integer.MAX_VALUE - x % 10) / 10) return 0;
            // rev = rev * 10 + x % 10 < Integer.MIN_VALUE
            // ==> rev < (Integer.MIN_VALUE - x % 10) / 10
            if (x < 0 && rev < (Integer.MIN_VALUE - x % 10) / 10) return 0;
            
            // x % 10 用于取出 x 的末位数(x 为负数则包括 x 的负号)
            // rev * 10 + x % 10 用于推入 x 的末位数
            rev = rev * 10 + x % 10;
            x /= 10; // 弹出末位数
        }
        return rev;
    }
}