题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
算法:
假设输入的整数为 ABCDEF,那么将这个整数从中间截取,得到两个整数 ABC 和 FED,比较这两个整数是否相等即可。
如果整数的位数为奇数,例如:ABCDE ,则比较 ABC 和 EDC。
class Solution {
public:
int length(int n){ //计算位数
int i=0;
while(n){
n=n/10;
i++;
}
return i;
}
bool isPalindrome(int x){
if(x<10&&x>=0){ //特殊情况:一位的正整数是回文数
return true;
}
if(x%10==0||x<0){ //排除负数和10的倍数情况
return false;
}
int len = length(x); //计算位数
bool flag=true;
if(len%2==0){ //计算截取的数据长度 = 总长度 / 2
len = len/2;
}
else{
len = (len/2) +1; //如果是奇数情况
flag =false;
}
int temp=0;
while(len){
temp = temp*10 + (x%10); //累加截取后的数据
if(flag){ //偶数长度的截取情况
x=x/10;
}
else{ //奇数长度的截取情况
if(len!=1){
x=x/10;
}
}
len--;
}
if(temp==x){ //如果截取后两个数相等
return 1;
}
return 0;
}
};
提交结果:
我看到题目描述最后边提示:能否不用转字符串的算法解决。然后我便没想着用字符串的方式解决了,提交程序后我看了一下耗时最短的大神用的还是转字符串。。好吧,还是转字符串比较快 - -
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一天过后回来重新检查一下代码,然后修了一下,把算位数的部分去除,添加了核心的判断句:在截取数字的过程中如果出现两部分整数相同则直接返回true,这样看起来代码比较短小点。
class Solution {
public:
bool isPalindrome(int x){
if(x<10&&x>=0){
return true;
}
if(x%10==0||x<0){
return 0;
}
int temp=0;
while(temp<=x){
temp = temp*10 + (x%10);
if(temp==x){
return true;
}
else{
x=x/10;
}
if(temp==x){
return true;
}
}
return 0;
}
};
提交结果:
-------------------------------------------------2020.4.5-------------------------------------------------
以上的思路都逐位比较,所花时间过多,应该直接计算反转过来的数值,再与原数值进行比较,如果相等,则true
附上别人的算法
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0 || (x != 0 && x % 10 == 0 )) return false;
int revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber / 10;
}
};