LeetCode 906 超級回文數

2021-08-28 11:56:12 字數 1550 閱讀 8832

如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。

現在,給定兩個正整數lr(以字串形式表示),返回包含在範圍[l, r]中的超級回文數的數目。

示例:

輸入:l = "4", r = "1000"

輸出:4

解釋:4,9,121,以及 484 是超級回文數。

注意 676 不是乙個超級回文數: 26 * 26 = 676,但是 26 不是回文數。

1 <= len(l) <= 181 <= len(r) <= 18lr是表示[1, 10^18)範圍的整數的字串。

int(l) <= int(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

leetcode906 超級回文數 沒有魔數

這道題答案其實只有70個最多,所以最快的解題者只要10ms 取巧 我是用正常人能理解的思路進行解題 例如 2839 38456739538 隨手寫的兩個數字 先進行開方處理得到53 196103 附 我先定義 回文源 就是通過這個數可以得到回文數,加上boolean值可以獲得回文,boolean用了...

LeetCode 超級回文數(轉換減小範圍)

如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。現在,給定兩個正整數 l 和 r 以字串形式表示 返回包含在範圍 l,r 中的超級回文數的數目。示例 輸入 l 4 r 1000 輸出 4 解釋 4,9,121,以及 484 是超級回文數。注意 676 不是乙個超...

力扣 超級回文數

如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。現在,給定兩個正整數 l 和 r 以字串形式表示 返回包含在範圍 l,r 中的超級回文數的數目。示例 輸入 l 4 r 1000 輸出 4 解釋 4,9,121,以及 484 是超級回文數。注意 676 不是乙個超...