9. 回文数 【简单】
题目要求
给你一个整数 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
提示:
- - 2 31 2^{31} 231 <= x <= 2 31 2^{31} 231 - 1
进阶:你能不将整数转为字符串来解决这个问题吗?
JAVA代码:
基础方法:
class Solution {
public boolean isPalindrome(int x) {
//根据题意,负数不是回文数
if(x<0){
return false;
}
String init = String.valueOf(x);
//将数字转为字符串
//注意(1)只有stringBuffer和stringBuilder有reverse方法,string没有
//注意(2)转回string类型,才能equals进行比较,否则一直返回true
String sb = String.valueOf(new StringBuffer(init).reverse());
if(init.equals(sb)){
return true;
}else{
return false;
}
}
}
进阶方法:
class Solution {
public boolean isPalindrome(int x) {
//根据题意,负数不是回文数
if(x<0){
return false;
}
//反转后的数字
int reverse = 0;
//原数字
int init = x;
while(x!=0){
int rest = x%10;
reverse = reverse*10+rest;
x/=10;
}
//将x倒序和x本身进行比较,判断是否为回文数
if(reverse == init){
return true;
}else{
return false;
}
}
}
严谨一点的话,需要判断数字反转之后是否超出int范围。
可以增加:
if(reverse > Integer.MAX_VALUE||reverse < Integer.MIN_VALUE){
return false;
}
考虑到数字翻转后,可能会超出int类型的范围。
官方方法:
class Solution {
public boolean isPalindrome(int x) {
//官方增加判断:x尾数为0时除非x为0,否则就不是回文数
if(x < 0||(x%10==0 && x!=0)){
return false;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
//思路:反转一半的数字,前后进行比较
int reverse = 0;
while(x>reverse){
int rest = x%10;
reverse = reverse*10+rest;
x/=10;
}
return x==reverse||x==reverse/10;
}
}
string双指针方法
新想出来的一种方法:头指针和尾指针分别从开头和结尾,向中间遍历。轴对称一样地判断字符是否一致,不一致就返回false,如果全部一致,就返回true。
class Solution {
public boolean isPalindrome(int x) {
if(x<0){
return false;
}
if(x==0) return true;
String re = String.valueOf(x);
int begin = 0;
int end = re.length()-1;
while(begin<end){
if(re.charAt(begin)!=re.charAt(end)){
return false;
}
begin++;
end--;
}
return true;
}
}