版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/maotianyi941005/article/details/80706943
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true
示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
答:不能。。
转字符串版
class Solution {
public:
bool isPalindrome(int x) {
ostringstream stream;
string ss;
stream << x;
ss += stream.str();
std::reverse(ss.begin(),ss.end());
if(x == atoi(ss.c_str())) return true;
else return false;
}
};
不使用字符串的版本是参考了别人的思路自己写的代码。。(ps感觉po啥都没考虑代码也能通过,我是怎么了饿。。。)
思路:头尾比较,如果相同,就掐头去尾再继续比较,此处还要对头尾的0进行处理
写代码途中遇到有几个坑点没考虑:
1 如10020001掐头去尾之后为2这时会跳出循环直接返回true。这是由于整型对前后的0都忽略了。
2 如100021:掐头去尾之后本来是0002,但由于是整数所以就只剩数字2了,这时会跳出循环直接返回true。对此我的处理是用2前后的0的长度来比较,2的前面3个0(code中的len是掐头去尾含前面0的长度,四位数字即1000,i是掐头去尾的长度即1,那么len / i =1000),2的后面0个0(len0=0),判断(len/i)!=len0的话就说明前后的0不对称,直接返回false。
class Solution {
public:
int getlen(int x){//其实返回的也不是长度啦,比如10021就返回10000
if(x == 0) return 0;
int i = 1;
while(x / i >= 10){
i *= 10;
}
return i;
}
bool isPalindrome(int x) {
if(x < 0) return false;
int i;
int len;
i = getlen(x);
len = i;
while(x >= 10) {
if ((x % 10) != (x / i)) return false;
x /= 10; // 去尾
int len0 = 1;
while(x % 10 == 0){
x /= 10; //去尾部0
len0 *= 10;
}
i = getlen(x);
len = i / 10;//去头去尾和去尾0之后的长度,去头肯定是去一位数
x %= i; //去头
i = getlen(x);
//printf("%d %d %d %d \n",x,i,len,len0);
if(x!=0 && i!=0 &&(len / i) != len0) return false;//0不对称
}
return true;
}
};