题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
思路:
1,首先不能转字符串(如果转换成字符串是不是就简单了)
2,这里其实只需要对数字的一半进行比较就行了 ,我这里采用的是对数字的后半部分进行旋转,然后跟前半部分比较。这时一个问题就出现了,就是怎么只对数字的后半部分反转,可以跟前半部分的数字进行大小的比对 如果出现前半部分小于等于后半部分就ok了;
3,比较,分两种情况,一种的数字的位数是偶数位,那么转换的结果一定是前后部
分相等。如果是奇数位数,那么后半部分比前半部分多了最后一位。
解答
class Solution {
public boolean isPalindrome(int x) {
//小于0 的 因为有个-符号 所以一定不是
if(x <0){
return false;
}
//等于0是回文数
if(x == 0){
return true;
}
//如果最后一位是0 那么也肯定不是回文数了。但是这个判断一定要在等于0后面
if(x%10 == 0){
return false;
}
//定义一个数字 用于记录后半部分转换后的结果
int val = 0;
//当前半部分小于后半部分的时候 循环结束
while(val < x){
val = val*10 + x%10;
x = x/10;
}
//判断,考虑后半部分比前半部分多一位数的情况
return x == val || x == val/10;
}
}
复杂度
时间复杂度:O(log(n)),n代表了数字的位数
空间复杂度:O(1)