力扣 #9 回文数(C++)

题目 官网oj

题目

法一 使用字符串操作:

  将所给的整数利用取余运算得到字符串,此时得到的字符串实际上是原来整数的"颠倒的数",如需将其正序,可以使用stack,本题不需要,因为如果该数是回文数,那么其颠倒以后仍然是一个回文数。得到字符串以后,从左边第一位开始和对应回文位置的字符一一比较,只需要比较length() / 2个位置(如果字符串长度为奇数,那么正中间那个字符不影响整个数的回文性),如果有不同,则返回false,不是回文数,若程序走到了整个for循环以后,则返回true,是回文数。

class Solution {
    
    
public:
    bool isPalindrome(int x) {
    
    
    	//如果是个负数,那不可能是回文数了
        if(x<0)
            return false;
            
        string s;
        while(x){
    
    
            s+=x%10+'0';
            x/=10;
        }
        for(int i=0;i<s.length()/2;i++)
            if(s[i]!=s[s.length()-i-1])
                return false;
        return true;
    }
};

法二 构造对应的回文数

  根据给出的整数构造其对应的回文数,如果这两个数相等,那么该整数就是回文数,比如给出的数是1234,则构造出的回文数是4321,两者不等,故1234不是回文数,如果给出的整数是12321,是个回文数,那么构造出来的回文数也是12321。

class Solution {
    
    
public:
    bool isPalindrome(int x) {
    
    
    	//b为构造的回文数,longlong是因为原本给出的2开头的9位数,若其个位为4,则构造出的回文数是4开头的9位数,超过int的最大值了
        long long a=x,b=0;
        if(x<0)
            return false;
        while(a){
    
    
        	//依次获得原数的个位
            int c=a%10;
            //a每次右移一位
            a/=10;
            //b左移一位后加上新的个位数
            b=b*10+c;
        }
        //如果构造的回文数和原数相等,则是回文数
        return b==x;
    }
};

法三 反转一半数字

  法二构造出了完整的原数的回文数,事实上只需要构造一半的回文数,然后判断两者是否相等,需要主义一些细节,见下代码。官方题解

class Solution {
    
    
public:
    bool isPalindrome(int x) {
    
    
        // 特殊情况:
        // 如上所述,当 x < 0 时,x 不是回文数。
        // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
        // 则其第一位数字也应该是 0
        // 只有 0 满足这一属性
        if (x < 0 || (x % 10 == 0 && x != 0)) {
    
    
            return false;
        }

        int revertedNumber = 0;
        while (x > revertedNumber) {
    
    
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return x == revertedNumber || x == revertedNumber / 10;
    }
};

猜你喜欢

转载自blog.csdn.net/Raymond_YP/article/details/108682801