【leetcode】9 回文数

版权声明:本文为博主原创文章,未经博主允许不得转载。 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进行处理

写代码途中遇到有几个坑点没考虑:

扫描二维码关注公众号,回复: 2924233 查看本文章

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;
    }
};



猜你喜欢

转载自blog.csdn.net/maotianyi941005/article/details/80706943