如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。
現在,給定兩個正整數 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)
思路分
析:\color思路分析:
思路分析
:這道題測試資料非常大,所以不能直接從[l, r]
一一進行判斷,我們得構造[l, r]
中的回文數,然後判斷它是不是乙個回文數的平方,或者判斷[sqrt(l), sqrt(r)]
中的回文數的平方是不是回文數。
方法一:直接尋找[l, r]
中的回文數,然後判斷它是不是乙個回文數的平方。(超時)
class
solution
}//在[myleft, myright]依次尋找回文數
while
(mynum <= myright)
//自增mynum,尋找下乙個回文串,比如"1234321"下乙個回文數是「1235321」 = 1234321 + pow(10, len("1234321") / 2)
string strnum =
to_string
(mynum)
; mynum +
=pow(10
, strnum.
size()
/2);
strnum =
to_string
(mynum)
; string right = strnum.
substr(0
, strnum.
size()
/2);
reverse
(right.
begin()
, right.
end())
; mynum =
stoll
(strnum.
substr(0
, strnum.
size()
- right.
size()
)+ right);}
return rescount;
}//判斷乙個數是否是回文
方法二:判斷[sqrt(l), sqrt(r)]
中的回文數的平方是不是回文數。
class
solution
}//在[myleft, myright]依次尋找回文數
while
(mynum <= myright)
//自增mynum,尋找下乙個回文串,比如"1234321"下乙個回文數是「1235321」 = 1234321 + pow(10, len("1234321") / 2)
string strnum =
to_string
(mynum)
; mynum +
=pow(10
, strnum.
size()
/2);
strnum =
to_string
(mynum)
; string right = strnum.
substr(0
, strnum.
size()
/2);
reverse
(right.
begin()
, right.
end())
; mynum =
stoll
(strnum.
substr(0
, strnum.
size()
- right.
size()
)+ right);}
return rescount;
}//判斷乙個數是否是回文
雖然通過了,蛋式時間複雜度、空間複雜度還是比較高。
使用時間0ms的思路是直接打表,面向測試示例程式設計。。。
LeetCode 906 超級回文數
如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。現在,給定兩個正整數l和r 以字串形式表示 返回包含在範圍 l,r 中的超級回文數的數目。示例 輸入 l 4 r 1000 輸出 4 解釋 4,9,121,以及 484 是超級回文數。注意 676 不是乙個超級回文...
leetcode906 超級回文數 沒有魔數
這道題答案其實只有70個最多,所以最快的解題者只要10ms 取巧 我是用正常人能理解的思路進行解題 例如 2839 38456739538 隨手寫的兩個數字 先進行開方處理得到53 196103 附 我先定義 回文源 就是通過這個數可以得到回文數,加上boolean值可以獲得回文,boolean用了...
力扣 超級回文數
如果乙個正整數自身是回文數,而且它也是乙個回文數的平方,那麼我們稱這個數為超級回文數。現在,給定兩個正整數 l 和 r 以字串形式表示 返回包含在範圍 l,r 中的超級回文數的數目。示例 輸入 l 4 r 1000 輸出 4 解釋 4,9,121,以及 484 是超級回文數。注意 676 不是乙個超...