一 题目描述
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
示例 1:
输入:x = 121 输出:true
示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
二 两个方法代码
public class LeetBook9 {
public boolean isPalindrome(int x) {
if (x < 0){//筛选掉负数能节省一点点点的内存空间
return false;
}
String xToStr = Integer.toString(x);//或者用String.valueOf(x); 将数字转为字符串
StringBuffer sb = new StringBuffer(xToStr);
String reverseX = sb.reverse().toString();//实现字符串的反转
return reverseX.equals(xToStr);
}
public boolean isPalindrome2(int x) {
if (x < 0){
return false;
}
int temp = x;
int y = 0;
while(temp != 0){
y = y * 10 + temp % 10;;//注意是x的个位成y的最高位,所以每一次都应该给其升位
temp = temp / 10;
}
return x == y;
}
}
三 遇到的一些问题
1.反转字符串 - isPalindrome
我尝试使用StringBuffer来将int转为string,然后通过reverse函数来直接反转,我认为这样会更加便捷(如果是负数,负号也会转为字符串的),但是没有想到运行速度并不理想,我就在想会不会是使用StringBuffer的问题,因为使用reverse这个函数是在StringBuffer类里面的,那我想着能不能我自己实现反转。就有了以下代码(很抱歉我自己实现的reverse还是用到了StringBuffer):
public boolean isPalindrome1(int x) {
if (x < 0){//筛选掉负数能节省一点点点的内存空间
return false;
}
String xToStr = Integer.toString(x);//String.valueOf(x); 将数字转为字符串
//两个位置箭头,表示这次需要反转哪两个位置
//比如第一次是0和倒数第一位互换,第二次是1和倒数第二位......
int start = 0, end = xToStr.length() - 1;
StringBuffer sb = new StringBuffer();
//如果start大于end,表示已经互换完了
while (start <= end){
if (start == end) { // 如果 start 和 end 相等,只插入一次
sb.insert(sb.length() / 2, xToStr.charAt(start));
} else {
//一次会加入两个字符,在/2的情况下,insert的位置都是一样的
//所以要先加入start再加入end,这样end的字符就会在start前面,实现了反转
//比如一开始,sb长度为0,0/2得到的插入位置是0.此时start的字符插入到位置0
//然后sb长度为1,1/2得到的位置是0,此时end的插入到位置0,
//由此start就往后顺延到位置1了,实现反转
sb.insert(sb.length() / 2, xToStr.charAt(start));
sb.insert(sb.length() / 2, xToStr.charAt(end));
}
start++;
end--;
}
String reverseX = sb.toString();
return reverseX.equals(xToStr);
}
这个代码要注意:
在while循环的if else中,由于一次会加入两个字符,在/2的情况下,insert的位置都是一样的,所以要先加入start再加入end,这样end的字符就会在start前面,实现了反转
比如一开始,此时sb长度为0,0/2得到的插入位置是0.此时start的字符插入到位置0,然后sb长度为1,1/2得到的位置是0,此时end的插入到位置0,由此start就往后顺延到位置1了,实现反转
但是结果是:时间大幅度大幅度增加,达到了11ms
于是我询问gpt给出对于StringBuffer的解释是:
isPalindrome
的反转字符串reverse,涉及创建新的字符串对象和字符数组,这需要额外的时间和空间。其时间复杂度主要受字符串操作的影响,虽然总体为O(n),但实际操作起来更慢。isPalindrome2
方法则直接在整数上进行数学操作,避免了任何字符串操作,因而更加高效。其时间复杂度也是O(n),但由于仅涉及简单的算术操作,其常数时间要小得多。
2.代数运算 - isPalindrome2
这个就比较好想了,运行速度也快,只需要注意注释中的部分就好,一开始没想明白这个10的倍数关系。
x的个位成y的最高位,所以每一次都应该给其升位,即第一次运算,x的个位充当y的个位,第二次运算就要当十位,要×10,第三次相比第二次,每一位又升一位,所以再×10
四 运行结果
五 意外的一些编程格式简化思路
对于比对原来的数字和新的数字然后返回return时,一开始我还要写一个if判断返回是false还是true,后来发现,if的判断语句本来就是一个返回bool类型的式子,所以直接return这个判断式就好,即: