9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
代码1
1、思路:根据题目可以看出只要是对称的数都是回文数,看到是给了一个数,第一个想法是把这个数的每位数上的数拿出来进行对比看是否相同,所有先把int类型转换成字符串,再把字符串转换成数组,依次遍历数组来进行前后对比,一旦有对称位置不相同的数,立即返回false,如果遍历完数组后发现都相同,即说明这个数是一个回文数,循环完后返回true.
class Solution {
public boolean isPalindrome(int x) {
String a=String.valueOf(x);//把数子转换成字符串
char[] num=new char[a.length()];
for(int i=0;i<a.length();i++){
num[i] = a.charAt(i);
}
for (int i=0;i<a.length()/2;i++){
if(num[i]!=num[a.length()-(i+1)]) {
return false;
}
}
return true;
}
}
答案还有一个思路我觉得有点繁琐,如果要直接对数字进行对比的话,我们没办法知道这个是有几位数,所有个人觉得很难对比。(如何把去数字的最后一位和第一位进行对比?)
例如,输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。
代码2
2.思路:考虑不用字符串的方法判断是否为回文数,例回文数为1234,如果要考虑用单纯数字来判度:
(1)要取1和4,4可以直接对10取余,比较难的是如何取1,想到的方法是让1234除以10的4次方就可以取到1
(2)要取2和3,取3可以先将1234-4=1230,然后1230/10=123,然后再对123取余得到3,取2的话,可以先让123-120。
class Solution {
public boolean isPalindrome(int x) {
int n,m,num1,num=0,x1=x;
if(x<0){
return false;
}
while(true){//用while判断这个判断的数有几位数
x1=x1/10;
num++;
if(x1==0){
break;
}
}
num1=num;
for(int i=0;i<(num1)/2;i++){//用m和n存储这个数的头尾两个数进行比较判断是否为回文数,每次对比完以后把尾数去掉然后取前面的那位数
n=x%10;
m=(x/(int)Math.pow(10,num-(i+1)))%10;
x=x/10;
num--;
if(n!=m){
return false;
}
}
return true;
}}
代码3
在后续学习中,想到用StringBuilder容器的方法来进行验证,先把数值放入容器中,再在容器中对数值进行反转,再用equals方法进行字符串的对比,运行成功。
但是用容器的方法运行速度好像没有比前两个快。并且占用的内存也挺大的。
class Solution {
public boolean isPalindrome(int x) {
String A= String.valueOf(new StringBuilder().append(x).reverse());
String B= String.valueOf(new StringBuilder().append(x));
if(A.equals(B)){
return true;
}else{
return false;
}
}}