题目描述
给你一个 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
的末尾,直至x
为0
,
注意该过程中若溢出则直接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;
}
}
标签:10,return,Reverse,示例,rev,VALUE,Integer,LeetCode
From: https://www.cnblogs.com/torry2022/p/17924547.html