LeetCode 906. 超级回文数

原题地址906. 超级回文数


 

如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。

现在,给定两个正整数 L 和 R (以字符串形式表示),返回包含在范围 [L, R] 中的超级回文数的数目。

示例:

输入:L = "4", R = "1000"
输出:4
解释:
4,9,121,以及 484 是超级回文数。
注意 676 不是一个超级回文数: 26 * 26 = 676,但是 26 不是回文数。

提示:

  1. 1 <= len(L) <= 18
  2. 1 <= len(R) <= 18
  3. L 和 R 是表示 [1, 10^18) 范围的整数的字符串。
  4. int(L) <= int(R)

算法

判断在 \sqrt L 和 \sqrt R 区间中的回文数的乘方是否回文数。若逐个遍历会超时,手动构造区间中的回文数,可以大大减少计算量。


代码

def fun(L, R):
    """
    :type L: str
    :type R: str
    :rtype: int
    """

    def ishw(a):
        s = str(a)
        mi = len(s)
        for i in range(int(mi / 2)):
            if s[i] != s[mi - i - 1]:
                return False
        return True

    import cmath
    ls = cmath.sqrt(int(L)).real
    ls = int(ls) + 1 if ls % 1 > 0 else int(ls)
    rs = int(cmath.sqrt(int(R)).real)
    ans = 0

    s = str(ls)
    flag = 1 if len(s) % 2 else 0
    mid = len(s) // 2 + 1 if flag else len(s) // 2
    tmp = int(s[:mid])
    num = ls

    while num <= rs:
        tmp1 = str(tmp)
        if len(tmp1) > mid:
            if flag == 0:
                mid += 1
            else:
                tmp1 = tmp1[:-1]
                tmp //= 10
            flag = 1 - flag
        tmp2 = tmp1[:-1] if flag else tmp1
        num = int(tmp1 + tmp2[::-1])
        if ls <= num <= rs and ishw(num * num):
            ans += 1
        tmp += 1
    return ans

 

猜你喜欢

转载自blog.csdn.net/HJXINKKL/article/details/82867387