本文我们来看看整数翻转大法——LeetCode第7题的解析。
引言
大家好!今天我们要解析的是LeetCode的第7题——整数反转。你有没有试过在生活中来一次180度大转弯?今天我们要做的就是让一个整数来个华丽的掉头,从正数变成负数,从123变成321。这听起来是不是很有趣?好了,让我们开始这场神奇的整数翻转之旅吧!
题目描述
给定一个32位的有符号整数,你需要将这个整数中的数字进行反转。如果反转后的整数溢出,则返回0。
示例1:
输入:123
输出:321
示例2:
输入:-123
输出:-321
示例3:
输入:120
输出:21
注意:假设我们的环境只能存储得下32位的有符号整数,其数值范围是 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后的整数溢出则返回0。
解题思路
- 初始化变量:定义一个变量
rev
来存储反转后的数字。 - 循环反转:通过循环,每次从原整数
x
末尾取一位数字,追加到rev
的末尾。 - 处理溢出:在每次添加新数字前,检查是否会导致溢出。
- 返回结果:最后返回
rev
。
实现代码
public class ReverseInteger {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
// 检查是否会溢出
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
public static void main(String[] args) {
ReverseInteger reverseInteger = new ReverseInteger();
System.out.println(reverseInteger.reverse(123)); // 321
System.out.println(reverseInteger.reverse(-123)); // -321
System.out.println(reverseInteger.reverse(120)); // 21
System.out.println(reverseInteger.reverse(1534236469)); // 0 (溢出)
}
}
解题过程可视化
使用Mermaid语法来展示这个过程,如下图所示:
例子讲解
例子1:整数 123
-
初始状态
x = 123
rev = 0
-
第一次循环
pop = 123 % 10 = 3
x = 123 / 10 = 12
rev = 0 * 10 + 3 = 3
-
第二次循环
pop = 12 % 10 = 2
x = 12 / 10 = 1
rev = 3 * 10 + 2 = 32
-
第三次循环
pop = 1 % 10 = 1
x = 1 / 10 = 0
rev = 32 * 10 + 1 = 321
-
结束循环
x = 0
- 返回
rev = 321
例子2:整数 -123
-
初始状态
x = -123
rev = 0
-
第一次循环
pop = -123 % 10 = -3
x = -123 / 10 = -12
rev = 0 * 10 + (-3) = -3
-
第二次循环
pop = -12 % 10 = -2
x = -12 / 10 = -1
rev = -3 * 10 + (-2) = -32
-
第三次循环
pop = -1 % 10 = -1
x = -1 / 10 = 0
rev = -32 * 10 + (-1) = -321
-
结束循环
x = 0
- 返回
rev = -321
例子3:整数 120
-
初始状态
x = 120
rev = 0
-
第一次循环
pop = 120 % 10 = 0
x = 120 / 10 = 12
rev = 0 * 10 + 0 = 0
-
第二次循环
pop = 12 % 10 = 2
x = 12 / 10 = 1
rev = 0 * 10 + 2 = 2
-
第三次循环
pop = 1 % 10 = 1
x = 1 / 10 = 0
rev = 2 * 10 + 1 = 21
-
结束循环
x = 0
- 返回
rev = 21
例子4:整数 1534236469 (溢出)
-
初始状态
x = 1534236469
rev = 0
-
第一次循环
pop = 1534236469 % 10 = 9
x = 1534236469 / 10 = 153423646
rev = 0 * 10 + 9 = 9
-
第二次循环
pop = 153423646 % 10 = 6
x = 153423646 / 10 = 15342364
rev = 9 * 10 + 6 = 96
-
后续循环…
- (略去中间过程)
-
第九次循环
pop = 1
rev = 964632435
rev * 10 + pop = 9646324350 + 1 = 9646324351
(溢出)
-
溢出检测
- 溢出,返回 0
总结
通过这几个例子,我们可以看到整数反转的过程实际上是不断地取出原整数的末尾数字,添加到新数字的末尾。需要特别注意的是整数溢出的处理,这也是这道题的难点之一。
结尾
整数反转是一道有趣的题目,通过这道题目,我们不仅学会了如何操作整数,还掌握了如何处理溢出情况。希望这篇博客能够帮助你更好地理解这道题目。
如果本文对您有所帮助的话,请收藏文章、关注作者、订阅专栏,感激不尽。