题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
解法
JAVA
public class Solution {
public boolean isPalindrome(int x) {
if(x< 0) {
return false;
}
int num=x;
int reverse = 0;
while (num!=0){
reverse=reverse*10+num%10;
num=num/10;
}
return x == reverse ;
}
优化写法
public boolean isPalindrome(int x) {
if(x< 0) {
return false;
}
int reverse = 0;
while (x>reverse){
reverse=reverse*10+x%10;
x=x/10;
}
return x == reverse ||x==reverse/10 ;
}
解题思路
一开始我想使用数个数的方法,然后运算符解决if(res==0||(res&(res-1))==0)
,然后出现了100这个用例,直接放弃。
然后打算将数字转换为字符串,并检查字符串是否为回文。发现题目也要求,最好不要使用数字转字符串的方式。
那我们根据题目要求
1.负数直接返回false,-121
2如果是正数,如121,其中前半部分12和后半部分翻转21翻转为12,是相同的,那就认为是回文的数字
,则将其倒序数值计算出来,然后比较和原数值是否相等 x == reverse ;
int num=x;
int reverse = 0;
while (num!=0){
reverse=reverse*10+num%10;
num=num/10;
}
最后对比翻转的数值和原始数值是否相同
return x == reverse ;
就这么结束了??
当然没,既然前半部分和后半部分翻转的数值相同就可以,没必要比较整个数值呢?
public boolean isPalindrome(int x) {
if(x< 0) {
return false;
}
int reverse = 0;
//当前半部分小于或者等于后半部分,停止循环
while (x>reverse){
reverse=reverse*10+x%10;
x=x/10;
}
//比较两个数值是否相同,由总个数可能奇数的情况,如12321,这是后半部分可能是123,需要去掉3对比
return x == reverse ||x==reverse/10 ;
}
写个位运算的小技巧
int [] res=new int[n<<1];
n<<1相当于2n,在数据扩容的时候,比较方便。