一、题目描述与要求
题目描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例:
1、输入:x = 121 输出:true
2、输入:x = -121 输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
3、输入:x = 10 输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
二、解题思路
1、如果该数为0则一定为回文数。
2、如果该数小于0或者个位数为0,则一定不是回文数。
3、
①定义一个无符号字符数组a[20]用来存放x倒序后的每一位。【因为不知道该数字有几位,所以只能够取倒序】(记得给数组放置结束符'\0')
此时定义j=i-1,也就是数组的最后一位的下标。接着调用for循环i=0对数组中的每一位进行比较,一旦a[i]!=a[j]则不是回文数,return false。一直到循环结束的话就代表是回文数。(注意for循环的判断条件是i<j。)
②定义一个变量reverse,用于存放数x后半部分的倒序结果。通过利用while循环,x>reverse为判断条件来求出reverse的值,然后将reverse与x进行比较,注意x可能为奇位数,因而比较条件应当为x==reverse||x==reverse/10。这里的/10就是为了舍去奇位数中间的数字。
三、具体代码
代码①【C语言】
bool isPalindrome(int x){
if(x==0)
return true;
if(x<0||x%10==0)
return false;
unsigned char a[20];
int i=0;
for(i=0;x!=0;i++)
{
a[i]=x%10;
x=x/10;
}
a[i]='\0';
int j=i-1;
for(i=0;i<j;i++)
{
if(a[i]!=a[j])
{
return false;
}
j--;
}
return true;
}
代码②【C++】
class Solution {
public:
bool isPalindrome(int x) {
if(x==0) return true;
if(x<0||x%10==0) return false;
int reverse=0;
while(x>reverse){
reverse=reverse*10+x%10;
x=x/10;
}
return x==reverse||x==reverse/10;
}
};