题目链接: 3.回文数
有关题目
给你一个整数 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 <= x <= 2^31 - 1
题解之数字本身反转
bool isPalindrome(int x){
int RevAll=0;
int num = x;
if(x<0 || (x % 10 == 0 && x != 0)) //小于零的数字与10的整数
return false;
while(x)
{
RevAll=RevAll*10+x%10;
x/=10;
}
//但是这样可能有数据溢出问题,在力扣里面能跑过去
if ( RevAll == num)
return true;
}
题解之反转一半数字
bool isPalindrome(int x){
int RevHalf=0;
if(x<0 || (x % 10 == 0 && x != 0))
//小于零的数字与10的整数肯定不行
return false;
while(x>RevHalf)
{
RevHalf=RevHalf*10+x%10;
x/=10;
}
return x == RevHalf || x == RevHalf / 10;
}
时间复杂度:O(log10底x)
空间复杂度:O(1)
注:由于题解之数字化为字符串中,创建字符串有额外的空间,空间复杂度增加,时间复杂度在上面的两种解法的基础上也未进行精简。
这边我们就简述这种解法的步骤,若有兴趣的话,请读者自行去完成
1.完成对数字位数的判断,这样才能把字符串存入到一个规定大小的字符串中
2.设有n位数字,那么从数组前后同时检索下图示:
int right = n - 1;
int left = 0;
while(right > left)
{
if (arr[left] != arr[right])
{
//发现不相等了,直接结束
return false;
}
else
{
left++;
right--;
}
}
//出循环就表示前后检索的数字都相等
return true;