本文我们来看看LeetCode 第9题:回文数的解析过程。
文章目录
一、引言
各位算法爱好者们,今天我们要探讨的是LeetCode第9题——回文数。提到回文数,你是不是瞬间想起了对称的“上海自来水来自海上”?没错,回文数就是这种前后读起来一样的数字。
题目描述
给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121。从右向左读, 为 121-。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01。因此它不是一个回文数。
好啦,以上是题目的描述。那么,这个回文数怎么搞定呢?别急,听我慢慢道来。
二、解题思路
方法一:转化为字符串
最简单粗暴的方法就是把整数转化为字符串,然后用双指针从两端向中间比较。如果每个字符都相等,那它就是回文数。
方法二:反转一半数字
你有没有觉得上面的办法有点投机取巧呢?毕竟把数字转成字符串再比较,总觉得不那么高效。那咱们可以试试直接对数字本身动刀子,看看能不能高效解决这个问题。
思路是这样的:
- 特殊情况处理:负数一定不是回文数;以0结尾的数字(除非是0本身)也不可能是回文数。
- 反转一半的数字:将数字的后半部分反转,然后与前半部分进行比较。
思路流程图
让我们用mermaid画个流程图来更清晰地展示解题思路:
三、Java代码实现
下面是两种方法的Java代码实现。
方法一:字符串法
public class Solution {
public boolean isPalindrome(int x) {
// 特殊情况处理
if (x < 0) {
return false;
}
// 转换为字符串
String str = Integer.toString(x);
int left = 0;
int right = str.length() - 1;
// 双指针比较
while (left < right) {
if (str.charAt(left) != str.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
}
方法二:反转一半数字法
public class Solution {
public boolean isPalindrome(int x) {
// 特殊情况处理
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除中间的数字
return x == revertedNumber || x == revertedNumber / 10;
}
}
代码解析
方法一:字符串法
- 特殊情况处理:负数直接返回
false
,因为负数不可能是回文数。 - 转换为字符串:将整数转换为字符串
str
。 - 双指针比较:设置
left
和right
两个指针,分别指向字符串的开头和结尾。然后逐个比较字符,如果相等则继续,否则返回false
。直到所有字符都比较完,则返回true
。
方法二:反转一半数字法
- 特殊情况处理:负数和以0结尾的数(除非是0本身)直接返回
false
。 - 反转一半数字:
- 初始化一个
revertedNumber
为0。 - 在
x
大于revertedNumber
时,逐位将x
的最后一位数字添加到revertedNumber
,同时x
去掉最后一位。 - 最终当
x
小于等于revertedNumber
时,我们已经反转了数字的一半。
- 初始化一个
- 比较前后部分:如果
x
等于revertedNumber
或x
等于revertedNumber
除以10(用于处理数字长度为奇数的情况),则返回true
。
四、举几个栗子
栗子一:简单回文数
输入: 121
- 字符串法:
- 转换为字符串:
"121"
- 双指针比较:
1 == 1
,2 == 2
- 返回
true
- 转换为字符串:
- 反转一半数字法:
- 反转过程:
revertedNumber
变为1
,12
- 最终
x
为1
,revertedNumber
为12
- 比较
1 == 12 / 10
,返回true
- 反转过程:
栗子二:负数
输入: -121
- 字符串法:
- 直接返回
false
- 直接返回
- 反转一半数字法:
- 直接返回
false
- 直接返回
栗子三:非回文数
输入: 10
- 字符串法:
- 转换为字符串:
"10"
- 双指针比较:
1 != 0
- 返回
false
- 转换为字符串:
- 反转一半数字法:
- 特殊情况处理,返回
false
- 特殊情况处理,返回
栗子四:回文数(带偶数位数)
输入: 1221
- 字符串法:
- 转换为字符串:
"1221"
- 双指针比较:
1 == 1
,2 == 2
- 返回
true
- 转换为字符串:
- 反转一半数字法:
- 反转过程:
revertedNumber
变为1
,12
- 最终
x
为12
,revertedNumber
为12
- 比较
12 == 12
,返回true
- 反转过程:
五、总结
通过这个题目,我们不仅学习了如何判断一个数是否是回文数,还探讨了两种不同的解题方法:直接转换为字符串法和反转一半数字法。通过这些方法,我们可以在不同情况下灵活应对,保证高效、正确地解决问题。
希望通过这篇博客,你不仅解决了这个LeetCode题目,还能在以后遇到类似问题时,运用这些技巧,从容应对。
如果本文对您有所帮助的话,请收藏文章、关注作者、订阅专栏,感激不尽。