题目来源:
力扣https://leetcode.cn/problems/palindrome-number/题目简介:
看一个数是不是回文整数。
思路:遍历一半
最简单的就是想到直接反转这个顺序表,然后检查反转后的和没反转之前的一不一致,这样确实思路很简单,如果给出的这个数一开始就大于int的范围,那么程序就无法执行,如果在int范围内那么就可以正常执行,但这个方法有一个弊端就是执行时间太长了,所以我们可以为了提高效率我们可以只反转一半的顺序表,然后记录反转的那部分和剩下的那部分是否一致,反转过程也很简单,就可以用一个while循环先把x%10,得到x的个位数,记录在变量i里面,然后再用x/10去掉x的那个个位数,最关键的一步就是创建一个变量rest,使rest=rest*10+i,一开始rest为0,所以第一轮计算得到的rest就是x的个位数,然后一直循环,我们用一个if语句时刻监测切这个x的过程,一旦发现rest>=x,我们就进入if语句,然后分奇数偶数的对x和rest进行对比,如果相等就返回true
代码实现:
bool isPalindrome(int x){
int rest=0;//比较重要的就是这个里对10的倍数的前提检测,要注意这个特点
if(x>=0&&x<=9){
return true;
}
if(x<=0||x%10==0){
return false;
}
while(x!=0){
int i=x%10;
x/=10;
rest=rest*10+i;//一定要一步步的思考,可以用一个数来一步步的思考程序的进行过程
if(rest>=x){
if(rest==x){
return true;
}
if(rest/10==x){
return true;
}
break; //在哪里跳出循环也是一个易错的点,这里是分奇数偶数后得到true所以跳出循环
}
}
return false;
}
思路2:数组加双指针遍历对比
我们可以把这个给的x字符串放到一个规定长度的数组里面,然后设定两个指针一前一后来对数组的元素进行对比。
代码实现:
bool isPalindrome(int x){
if(x>=0&&x<=9){
return true;
}
if(x<=0||x%10==0){
return false;
}
int cnt=0;
int nums[11];
//分为两个阶段,1.填充数组
这里其实有个比较细的点,就是这个循环语句不用for,而用while,观察第二阶段里,我们仍然需要用到cnt,而在第一阶段如果用for语句的话cnt变量的初始化就变为局部变量,在第二部分就不利于直接使用。
while(x>0){
nums[cnt]=x%10;
x/=10;
cnt++;
}
int left=0;
int right=cnt-1;
//2.比较前后指针指向的数
while(left<right){
if(nums[left]!=nums[right]){
return false;
}
left++;
right--;
}
return true;
}