前情提要
这道题是我复习的一道题,因为算法自己做完都会忘,更别提有的还不是自己做的,在deepseek的提醒下,决定每天复习一道算法。先选这个是因为这是一段痛苦的回忆这是我第一次面试时的笔试题,太悲伤了,明明知道做过却怎么都想不起来怎么做(当时还不怎么会用字符和字符串)。
题解一
思路
先全部转为字符数组,循环到 数组长度/2(奇数的话中间只剩一位不用管),一一比对即可
代码
class Solution {
public boolean isPalindrome(int x) {
char[] charArray = String.valueOf(x).toCharArray();
for(int i = 0;i<charArray.length/2;i++){
if(charArray[i]!=charArray[charArray.length-1-i]){
return false;
}
}
return true;
}
}
总结
这里面这个把数字转为字符数组的操作,不太熟练(根本不会)还是临时找的哈哈哈哈,学到了。
题解二
思路
新建一个变量存储x,然后对x进行倒置,最后将两个数进行对比。
代码
class Solution {
public boolean isPalindrome(int x) {
if(x == 0){
return true;
}
if(x<0||x%10 == 0){
return false;
}
int origin = x ;
long inverted = 0;
while(x!=0){
inverted = inverted*10 + x % 10;
x /= 10;
}
if(origin == inverted){
return true;
}
return false;
}
}
在Leetcode里看见的缩减版(好清爽)
class Solution {
public boolean isPalindrome(int x) {
int res = 0;
for(int i=x; i>0; i/=10){
res=i%10+res*10;
}
return res==x;
}
}
总结
记得之前看题解三说过,完全倒序输出可能会溢出,建议inverted的定义用long。
题解三(也是我到现在都记不住的一种解)
思路
首先还是先把特殊情况(负数、非0的模10余0的数)判断了。
然后将数字倒转一半,x也同步除以10,判断条件很有说法,当x>倒置后的数时进行while循环,
最后若 x=倒转一半后的数/10(奇数情况)或者 x=倒转一半之后的数(偶数情况)。
代码
class Solution {
public boolean isPalindrome(int x) {
if(x == 0){
return true;
}
if(x<0||x%10 == 0){
return false;
}
int reverted = 0;
while(x>reverted){
reverted = reverted*10+x%10;
x /= 10;
}
return x == reverted / 10 || x == reverted;
}
}
总结
这个思路真是太无敌了,我只有膜拜的份