题目描述
Determine whether an integer is a palindrome. Do this without extra space.
题目大意:即检测一个数是否为回文数,不开辟额外的空间
思路比较简单
第一步:统计x的长度。
第二步:比较x的最高位和最低位是否相等
第三步:如果第二步的结果相等,则将x的最高位和最低位的数字去掉变为新的x,重复第一步和第二步即可。
注意:在第三步中有一点需要注意:在去除最高位的时候可能最高位后面的1位或几位为0,则需要进行下一步判断之前,先判断新的x的后面是否有相同多的0元素。
实现代码如下:
/*
测试用例:
没有想到的测试用例
1)负数:x=-121,,不是回文数
2)x=1000021,不是回文数
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int my_length(int x){
int len=0;
while(x!=0){
len++;
x/=10;
}
return len;
}
bool isPalindrome(int x) {
//先求这个数的长度
if(x<0){
return false;
}
int len=my_length(x);
if(len==1)
return true;
bool flag=true;
int preLen=len+2;
while(x!=0){
len=my_length(x);
//为解决x=100021这种情况为回文数的情况,和x=1002001不是回文数的情况
//添加如下代码
int dif=preLen-len-2;
if(dif!=0){//说明最高位之后的零去掉了。
//这样检查下尾端有没有diff个零
if(x%((int)(pow(10,dif)))){
return false;
}
x/=(int)(pow(10,dif));
}
len=my_length(x);//在更新下len
preLen=len;
if(len==1){
break;
}
int temp1=x%10;
int temp2=x/((int)(pow(10,len-1)));
if(temp1!=temp2){
flag=false;
break;
}
x%=((int)(pow(10,len-1)));//将最高位去掉
x/=10;//将最低位去掉
}
return flag;
}
int main(void){
int num;
while(scanf("%d",&num)!=EOF){
bool flag=isPalindrome(num);
if(flag){
printf("yes\n");
}
else{
printf("NO\n");
}
}
return 0;
}
AC结果如下
遇到的问题
没有考虑到这种测试用例。
解决思路:在第三步中有一点需要注意:在去除最高位的时候可能最高位后面的1位或几位为0,则需要进行下一步判断之前,先判断新的x的后面是否有相同多的0元素。
小结
从结果可以看出,尽管AC了,但是效率不高,仍需要改进