给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。(来源:力扣(LeetCode)第九题)
思路1:最开始接触,第一时间的想法就是把整数转成数组,然后用两个指针,一个从前开始扫描,一个从后开始扫描。都终止于数组长度/2。如果出现一次不一样就返回false。
Java代码:
class Solution {
public boolean isPalindrome(int x) {
char[] s =String.valueOf(x).toCharArray();//转成数组
for(int i=0,length=s.length;i
这只是很简单的考虑,然后突然发现,不因该调用各种函数。如果这样做,都可以只用2行,直接调用把对应的数组转换。
思路2:
不使用各种内置的函数。首先如果一个数是负数,如-123,“-”和“3”不对应,不是回文数。然后只要处理正数就行。处理整数的基本想法就是用一个数表示倒序的数。具体的迭代过程如下所示:
Java代码:
class Solution {
public boolean isPalindrome(int x) {
//负数直接输出
if(x<0){
return false;
}
int rer = 0;
int num = x;
while(num!=0){
rer = rer*10+num%10;
num=num/10;//去除最低的位,如123变成12
}
return rer==x;
}
}
思路3:
将思路2简化,只比较一半。原来用数组的时候可以用数组长度的一半来终止。现在不好确定中间终止的地方,只能用数的大小进行比较。具体举例如下。
java代码:
class Solution {
public boolean isPalindrome(int x) {
//小于0的数和已0结束不为0的数都不是回文数,可以直接判断
if(x<0||(x%10==0&&x!=0)){
return false;
}
int reverseNum = 0;
while(x>reverseNum){
reverseNum = reverseNum*10 + x%10;
x = x/10;
}
return (x==reverseNum)||(x==reverseNum/10);
}
}
我在看力扣时,有人说这个算法有bug。比如143321,会变成143(x)和123(rev),此时143>123,所以变成14和1233。最终用return语句判断false(14==1233),false(14==1233/10),所以还是false。
提交过程:
总结:
我觉得这三种思路的通用之处就是双指针的思想,用双向的指针来简化代码。当然上面的思路除了第一个自己写的(比较丑),下面两个都是在参考了讲解后,又写出来的。可能有许多地方的描述比较像当然。主要分享是希望能坚持学下去。



