9. 回文数
题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
方法1
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
直接方法
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0)
return false;
int n = 0;//位数
int num = x;
//求出x的位数
while(num!=0)
{
n++;
num = num/10;
}
//从右边起的位数下标为0,1,2,3,4。。。,
//与之对应的位的权值为10^0,10^1,10^2,10^3,。。。
//x = abcde,x = a*10^4+b*10^3+c*10^2+d*10^1+e*10^0
//若得ab,则可令x/10^3,这可根据x按照各个位的权值分解相加公式及
//公式两边的小学生除法公式定义可以得出这个结论
for(int i = 0;i<n/2;i++)
{
//当前比较的位下标为r=i,这是从右边以0为起始下标为依据的,
//与之对应的位r从左边以0为起始下标为依据,的下标为i,它与最右边
//的位的位移为n-1-i,而两个位之间的位移,在不同的坐标系中是相同的
//于是将r转换到以右边0为起始下标的坐标系中的下标为n-1-i
int l = (x/(int)pow(10,n-1-i))%10;
int r = (x/(int)pow(10,i))%10;
if(l!=r)
return false;
}
return true;
}
};
方法2
还是直接方法,但是将数转化为了字符串,不符合题目要求,使用额外空间了。
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0)
return false;
//C++中将一个整数值转化为字符串的方法to_string(),java中为类方法
//.toString(),python中为str()
string s = to_string(x);
int n = s.length();//转换为字符串后可以便利我们的
for(int i = 0;i<n/2;i++)//针对解决问题要做的操作
{ //例如,得到长度,得到每一位的值
if(s[i]!=s[n-1-i])
return false;
}
return true;
}
};
方法3
比较好的解法:直接求出翻转后的整数值和x比较,如果x是回文数的话,翻转后的整数可能不会溢出,如果原数不溢出,翻转后的数发生了溢出现象,说明原数x一定不是回文数。
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0)
return false;
int temp = x;
unsigned reverse = 0;
while(temp!=0)//求翻转数字的成熟代码操作
{
reverse = 10*reverse+temp%10;
temp/=10;
}
//上面的解法是一位一位的比较,这样的比较需要手工操作进行
return reverse == x;//而这里直接将翻转后的数字求出来,使用相等运算符直接得出结论
}
};