一 题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true
示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
二 解题思路
1.这道题我们第一时间可以联想到我们上一道题-反转数,只要反转数跟原来的数一样就返回true即可
2.但其中有一些可以优化的点:a.只要为负数的,都应该直接返回false; b.只要小于10 的正整数,都应该直接返回true,这样可以省掉很多计算和比较次数,但最坏的情况可能会导致比较次数增多(测试的用列如果都是大于10的整数,两个前提都会多增加两次的比较)
三 代码实战
public static int reverse (int x) {
int reverse = 0;
while (x!=0){
reverse = reverse * 10 + x % 10;
x/=10;
}
if(reverse>Integer.MAX_VALUE||reverse<Integer.MIN_VALUE){
return 0;
}
return reverse;
}
public static boolean isPalindrome (int x){
if(x<0){
return false;
}
if(x<10){
return true;
}
if(x==reverse(x)){
return true;
}
return false;
}
四 扩展点
用反转的方法再优化最好的时间复杂度为O(n)(除了两个特例(负数和小于10)的时间复杂度为O(1))(因为你得遍历整数的位数)
但还有一种更加有优化空间的是用string来代替num类型的方法(但本题建议是不将它转换成字符串来解决,故不用此方法)
解题思路还是我之前的二分法思想,遍历该数的一半长度,每一次把相对称的元素进行对比,只要不相同则直接返回false,时间复杂度为O(n/2),代码实例如下:
public boolean isPalindrome(int x) {
String s = ""+x;
for(int i = 0;i < s.length()/2;i++)
{
if(s.charAt(i) != s.charAt(s.length()-1-i))
{
return false;
}
}
return true;
}