目录
题目:
给你一个 32 位的有符号整数
x
,返回将x
中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围
假设环境不允许存储 64 位整数(有符号或无符号)。[−231, 231 − 1]
,就返回 0。示例 1:
输入:x = 123 输出:321示例 2:
输入:x = -123 输出:-321示例 3:
输入:x = 120 输出:21示例 4:
输入:x = 0 输出:0提示:
-231 <= x <= 231 - 1
1. 思路
要反转一个整数,可以使用取模和除法运算,将整数的每一位依次取出并放置在反转后的位置上。需要注意的是,在进行反转时要注意整数溢出的情况,即反转后的结果超过了 32 位有符号整数的范围 [-2^31, 2^31 - 1]。
2. 解题方法
- 初始化一个变量
result
用于存储反转后的结果,初始值为 0。 - 循环将整数
x
的每一位取出并放置在result
的末尾。 - 在每次循环中,先将
x
对 10 取模得到当前位的数字,然后将x
除以 10 更新x
。 - 在更新
result
时,要检查是否会发生整数溢出,即result * 10 + digit > Integer.MAX_VALUE
或result * 10 + digit < Integer.MIN_VALUE
,如果发生溢出则直接返回 0。 - 最后返回
result
。
3. 复杂度
- 时间复杂度:O(log|x|),其中 |x| 表示整数 x 的位数,因为需要对 x 进行除法运算。
- 空间复杂度:O(1)。
4. Code
class Solution {
public int reverse(int x) {
int result = 0;
while (x != 0) {
int digit = x % 10; // 获取当前位的数字
x /= 10; // 更新 x
// 判断是否会发生整数溢出
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && digit > 7)) return 0;
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit < -8)) return 0;
// 更新 result
result = result * 10 + digit;
}
return result;
}
}
这段代码实现了将一个整数进行反转的功能,通过对整数进行取模和除法运算,逐位反转并检查是否发生整数溢出,最终得到反转后的结果。
欢迎大家后台联系讨论。
(一份比较早的面试宝典,有兴趣的读者姥爷可以私信我领取!!!免费滴)