LeetCode题目笔记--9.回文数

题目描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  本人不才,自己想的思路不快,还是看了一下官方的题解,确实妙。

数学解法

  回文首先不能是负数,因此可以一上来就判断输入是不是负数。其次,是10的整数倍也不是回文,所以可以一并判断。需要注意的是0也是回文
C代码:

bool isPalindrome(int x){
    
    
    if(x < 0 || (x != 0 && x % 10 == 0))
    {
    
    
        return false;
    }
    int rN = 0;
    while (x > rN)
    {
    
    
        rN = rN * 10 + x % 10;
        x /= 10;
    }
    return x == rN || x == rN / 10;
}

  求后半段数字的时候顺便把原来的x慢慢变小,直到x<=rN,如果x的位数是奇数个,那中间那个数就无所谓,就在最后返回的时候用rN/10即可。

字符串解法

  由于对python字符串处理比较熟悉,一开始就想到了字符串解法。先将输入x转换成字符串,然后循环判断对称位置上的字符是否一样。
初级python代码:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        buf = str(x)
        size = len(buf)
        for i in range(size // 2):
            if buf[i] != buf[size - i - 1]:
                return False

        return True

  字符串解法的话,可以跳过检查负数的操作,因为负数可以直接在循环里检测到,第一次循环就会return False。这样的运行效果是80ms,击败了82.19%的人,那还能不能更快?
  字符串切片是个好东西啊,真香,直接利用切片操作把转换后的字符串反转,再比较这两个字符串是否相等不就完事儿,只需3行代码。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        temp = str(x)
        buf = temp[::-1]
        return temp == buf

  领扣的OJ我感觉有毒,我这提交上去运行竟然不进反退,运行100ms,前面有一样的代码运行40ms,我佛了。

猜你喜欢

转载自blog.csdn.net/weixin_44801799/article/details/107783167