LeetCode:906.超级回文数

这道题作为一个困难的问题,考察的是用户对所编写程序执行效率的掌握,我自己在做的时候,优先考虑到一般的解法,然而这样会导致最后判断比较大的数字的时候超出时间限制,但是这里仍然是把所谓"不正确(也即超时)"的代码贴上,用作后续两种解法的对比。

class Solution:



    def superpalindromesInRange(self, L: str, R: str) -> int:
        def isPalindrome(number):
            number = str(number)
            i = 0
            rnumber =  number[::-1]
            while i < len(number):
                if number[i] != rnumber[i]:
                    return False
                i+=1
            return True
        sum = 0
        for i in range(int(L), int(R) + 1):
            if isPalindrome(int(math.sqrt(i)))==True and\
                    isPalindrome(int(i))==True and \
                    int(math.sqrt(i))*int(math.sqrt(i))==i:
                sum=sum+1
        return sum

下面给出一来自LeetCode官方的一种正确的解法:

在这里插入图片描述

class Solution(object):
    def superpalindromesInRange(self, L, R):
        L, R = int(L), int(R)
        MAGIC = 100000

        def reverse(x):
            ans = 0
            while x:
                ans = 10 * ans + x % 10
                x /= 10
            return ans

        def is_palindrome(x):
            return x == reverse(x)

        ans = 0

        # count odd length
        for k in xrange(MAGIC):
            s = str(k)  # Eg. s = '1234'
            t = s + s[-2::-1]  # t = '1234321'
            v = int(t) ** 2
            if v > R: break
            if v >= L and is_palindrome(v):
                ans += 1

        # count even length
        for k in xrange(MAGIC):
            s = str(k)  # Eg. s = '1234'
            t = s + s[::-1]  # t = '12344321'
            v = int(t) ** 2
            if v > R: break
            if v >= L and is_palindrome(v):
                ans += 1

        return ans
发布了69 篇原创文章 · 获赞 33 · 访问量 1168

猜你喜欢

转载自blog.csdn.net/dosdiosas_/article/details/105730059