开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
- 输入:x = 121
- 输出:true
示例 2:
- 输入:x = -121
- 输出:false
- 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
- 输入:x = 10
- 输出:false
- 解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
进阶:你能不将整数转为字符串来解决这个问题吗? 自己凭借之前c语言的做题习惯,上来就是整数转字符串,然后数学解法,但是还不会java高级语法,写了串蹩脚代码。
这里也有一个点,因为像-123这种负数一定不是回文数,所以我们可以首先排除一下负数,假如x<0,就直接返回false就可以了
class Solution {
public boolean isPalindrome(int x) {
int t=x,i=0,c=0;
int[] a=new int[100];
if(x<0){
return false;
}
while(t>0){
a[i++]=t%10;
t/=10;
c++;
}
boolean flag=true;
for(i=0;i<c/2;i++){
if(a[i]!=a[c-i-1]){
flag=false;
break;
}
}
return flag;
}
}
然后就开始学习算法和语法
先是语法,暴力解法也可以写起来很简洁,只需要用reverse和toString方法就可以了
class Solution {
public boolean isPalindrome(int x) {
String a=String.valueOf(x);
String sb=new StringBuilder(a).reverse().toString();
if(a.equals(sb)){
return true;
}
return false;
}
}
巧解
还有一种巧妙的解法,我们都知道回文数就是将其对折能一一对应的,所以我们可以把这个数的后半段翻转过来和前半段对比看是不是一一对应的。所以他的核心操作就是 取出后半段数字进行翻转。
class Solution {
public boolean isPalindrome(int x) {
if(x<0 || (x%10==0 && x!=0)){
return false;
}
int rn=0;
while(x>rn){
rn=rn*10+x%10;
x/=10;
}
return x==rn || x==rn/10;
}
}
这里也是,要先排除负数,同时我们也可以看到,还首先排除了结尾是0的数,这是为什么呢?
因为一个数不可能以0开头,那么此时如果他以0结尾的话,就一定不是回文数了,同时这里这个数不能是0,0是回文数,所以这里的判断语句要仔细写一下。
再说怎么取x后半段,就用这个算式就可以啦
rn=rn*10+x%10;
真的很好用。
然后最后返回的地方我们不是单纯的return x==rn,而是加了一个或x==rn/10,这里就是假如这个数x长度为奇数时,我们可以用让rn/10来轻松去掉中位的数字。
这道题就是这样啦,很简单的一道题,但因为我是新手,不能慌,先从简单的开始,一步一个脚印努力吧!