- 问题描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。 示例 1: 输入:x = 121 输出:true 示例 2: 输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3: 输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。 示例 4: 输入:x = -101 输出:false 提示:-231 <= x <= 231 - 1
解决方法:
1. 将数字转换为 字符数组 然后通过循环判断数字是否是回文数
2. 得到给定数字的反转数,然后判断是否与原数相同(得到的数字有超出范围的可能)
3. 将给定的数字反转一般,通过一个变量存储,然后判断是否相同
方法1:
将数字转换成字符数组然后判断一下就行了
代码:
if(x < 0 || (x % 10 == 0 && x != 0)){
return false;
}
String value = String.valueOf(x);
char[] chars = value.toCharArray();
int length = chars.length;
for(int i = 0;i < length / 2;i++){
if(chars[i] != chars[length - i -1]){
return false;
}
}
return true;
运行结果:
方法二:
将给定的数字反转,得到反转的数字并于原数字就行判断
至于高效率反转整数可以参考我的另一篇文章:
https://blog.csdn.net/Lagi_lanumoa/article/details/120004471
代码:
if(x < 0 || (x % 10 == 0 && x != 0)){
return false;
}
int rev = 0;
int Max = (int) (Math.pow(2,31) - 1);
int Min = -(Max + 1);
int number = x;
int end;
/* 反转全部数字 */
while(number != 0){
if(rev < (Min / 10) || rev > (Max / 10)){
return false;
}
end = number % 10;
number /= 10;
rev = rev * 10 + end;
}
return rev == x;
运行结果:
方法三:
方法和方法2有些类似,我们将给定数字的一般进行反转,然后判断与原数字是否相同,当然原数字也要跟着变化。
x 为给定判断是否是回文数的数字
x | reverted Number |
---|---|
12321 | 0 |
1232 | 1 |
123 | 12 |
12 | 123 |
由上图可以看到,当 reverted Number >= x 是结束循环,得到需要的反转数,同时有以下两种情况:
1. reverted Number = x
2. reverted Number > x,这个时候对reverted Number 处理以下然后与 x 进行判断就能得到我们需要的结果。
代码:
if(x < 0 || (x % 10 == 0 && x != 0)){
return false;
}
int rev = 0;
int end;
while( x > rev ){
end = x % 10;
x /= 10;
rev = rev * 10 + end;
}
if(x < rev){
rev /= 10;
}
return x == rev;
运行结果:
PS:给个赞呗!😊呗