如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。
現在,給定兩個正整數l
和r
(以字串形式表示),返回包含在範圍[l, r]
中的超級回文數的數目。
示例:
輸入:l = "4", r = "1000"
輸出:4
解釋:4,9,121,以及 484 是超級回文數。
注意 676 不是乙個超級回文數: 26 * 26 = 676,但是 26 不是回文數。
1 <= len(l) <= 18
1 <= len(r) <= 18
l
和r
是表示[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 不是乙個超...