【Leetcode-简单-09】回文数

【Leetcode-简单-09】回文数

题目描述:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

  • 给定一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
  • 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例:

  • 示例1:
输入:x = 121
输出:true
解释:从左向右读,121 。 从右向左读,121 。因此它是一个回文数。
  • 示例2:
输入:x = -121
输出:false
解释:从左向右读,-121 。 从右向左读,121- 。因此它不是一个回文数。
  • 示例3:
输入:x = 10
输出:false
解释:从左向右读,10 。 从右向左读,01 。因此它不是一个回文数。
  • 示例4:
输入:x = -101
输出:false
  • 提示:
             -2**31 <= x <= 2**31 - 1

代码(python3)

方法① 解析思路:

  • 参考整数反转的思路,只计算正整数的反转,反转结果与输入数值相等即可
  • 同时,还要考虑数值大小,数值溢出的情况
class Solution:
    def isPalindrome(self, x: int) -> bool:
        org,temp,res = x,0, 0;
        INT_MAX = 2**31-1;
        while x > 0:
            temp = x % 10;
            if res > INT_MAX:
                return False;
            res = res *10 + temp;
            x //= 10;
        if res == org:
            return True;
        else:
            return False;

方法② 解析思路:

  • 翻转一半数字
  • 同时,还要考虑数值大小,数值溢出的情况

class Solution:
    def isPalindrome(self, x: int) -> bool:
    '''  特殊情况:
       如上所述,当 x < 0 时,x 不是回文数。
       同样地,如果数字的最后一位是 0,为了使该数字为回文,
       则其第一位数字也应该是 0
       只有 0 满足这一属性
     '''
        if x < 0 or (x % 10 == 0  and  x != 0 ):
            return False;
        reverteNumber = 0;
        while x > reverteNumber:
            reverteNumber = reverteNumber * 10 + x % 10  ;
            x //= 10;
        return x == reverteNumber or x == reverteNumber // 10

方法③ 解析思路:

  • 首先将数组转为字符串
  • 使用两个指针,一个从左往右遍历字符串,一个从右往左遍历,同步移动对比,如果遇到两个不相等的情况,则不为回文数,直到两个指针相等

class Solution:
    def isPalindrome(self, x: int) -> bool:
        s=str(x)
        # 指针对比数值
        l,r=0,s.__len__()-1
        while(l<=r):
            if s[l]==s[r]:
                l+=1
                r-=1
            else:return False
        return True


代码(c++)

方法① 解析思路:(官方)

  • 首先,我们应该处理一些临界情况。所有负数都不可能是回文
  • 例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。除了 0 以外,所有个位是 0 的数字不可能是回文,因为最高位不等于 0。所以我们可以对所有大于 0 且个位是 0 的数字返回 false。
  • 考虑如何反转后半部分的数字:

对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,可以得到更多位数的反转数字。

  • 如何知道反转数字的位数已经达到原始数字位数的一半?

由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。

class Solution {
    
    
public:
    bool isPalindrome(int x) {
    
    
        //先考虑特殊情况:
        //根据回文数结构, x<0 不是回文数;当开始第一位数字为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;
    }
};


  • 复杂度分析
    时间复杂度:O(\log n)O(logn),对于每次迭代,我们会将输入除以 1010,因此时间复杂度为 O(\log n)O(logn)。
    空间复杂度:O(1)O(1)。我们只需要常数空间存放若干变量。

方法2:参考整数反转的思路,只计算正整数的反转,反转结果与输入数值相等即可


class Solution {
    
    
public:
    bool isPalindrome(int x) {
    
    
        int tmp = 0;
        int res = 0;
        int org = x;
        while (x > 0) {
    
    
            tmp = x % 10;
            if (res > INT_MAX/10) {
    
    
                return false;
            }
            res = res * 10 + tmp;
            x = x /10;
        }
        if (res == org) {
    
    
            return true;
        } else {
    
    
            return false;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/Kefenggewu_/article/details/121061634