1.题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
输入:x = 121
输出:true
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
(来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number)
2.想法
2.1 :起初想法是将int x转换成字符串,在转换为 StringBuilder 使用reverse方法 进行对比,即可返回正确与否。
2.2:方法2.1实现后发现内存和时间消耗的很多,这题比较简单,想用一个start 和end 进行前后项的对比,当遍历完所有的 字符都相等时,返回true,否则为false
3.实现
2.1的实现
class Solution {
public boolean isPalindrome(int x)
{
//判断是否超出边界
if(x>Integer.MAX_VALUE||x<Integer.MIN_VALUE){return false;}
String strX = String.valueOf(x); //转化为字符串
StringBuilder sb = new StringBuilder(strX);
String sb2str = sb.reverse().toString();//翻转一下
if(sb2str.equals(strX)){
return true;
}
else {return false;}
}
}
知识点:int 转换为 String String.valueOf(int x)
字符串的比较 使用的事equals 但不是‘==’
原因:基本字符串比较 == 符号比较的是值,引用变量比较的是地址
两个字符串的比较 必须是‘equals()’;
例子;equals和==的区别是什么
用时、内存情况:
2.2的实现
class Solution {
public boolean isPalindrome(int x) {
int start = 0;
String strX = String.valueOf(x);
int length = strX.length();
int end = length-1;
while(end>=start){
if(strX.charAt(end)==strX.charAt(start)){
start++;
end--;
}
else break;
}
if(end<start) return true;
else return false;
}
}
这里需要注意的是 我在写的时候 那个while里面没有写等号,就是x长度(这样说不合适,理解就好)是偶数时没问题, 但是奇数时就会存在等于,这个奇偶数需要考虑一下哦。
用时、内存情况:
4.别人的解法
自己的方法虽然能理解 ,但是效率不是很高,看一下别人是咋做的 。
官方的思路是:
先排除掉特殊的:负数、末尾是0的但数不等于0,这些是false;
其他数字可以 取10的模,得到 倒数第一位,再将倒数第一位数字移除(直接除以10即可),再取10的模,得到 倒数第2位,将得到倒数的数字 第一个数*10+第二个数字,持续反转即可。当原始数字小于等于 翻转数字。就结束了。
叙述官方的说法还是有点一知半解 ,尝试着写写看。
class Solution {
public boolean isPalindrome(int x) {
//特殊情况的
if(x<0||(x%10==0&&x!=0))
{
return false;
}
int revertNum = 0;//反转后的
while(x>revertNum )//循环条件
{
revertNum =revertNum*10 + x%10;
x=x/10;
}
//是偶数的话直接返回,是奇数的话看reverNum/10 和x是否相等
//自己的想法是用个if判断一下,官方是直接返回的,那我就直接这样写了
return reverNum/10==x||reverNum==x;
}
}
5.小结
这道题比较简单 ,那么看的就是 使用的时间和空间复杂度的问题,虽然能解出来,我得复杂度比较高。可以看看别人题解的答案扩宽自己的思路,在 写官方给的思路时,我也看了几眼官方怎么写的,比如revertNum =revertNum*10 + x%10;和最后return,看了官方的程序,希望再读其他解题思路的时候,先要读懂别人的思想,再写,别着急。