新聞中心
這篇文章將為大家詳細(xì)講解有關(guān)LeetCode如何找出數(shù)字序列中某一位的數(shù)字,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
沙依巴克網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
題目描述
數(shù)字以 0123456789101112131415…的格式序列化到一個(gè)字符序列中。在這個(gè)序列中,第 5 位(從下標(biāo) 0 開(kāi)始計(jì)數(shù))是 5,第 13 位是 1,第 19 位是 4,等等。
請(qǐng)寫(xiě)一個(gè)函數(shù),求任意第 n 位對(duì)應(yīng)的數(shù)字。
0 <= n < 2^31
題目樣例
示例
輸入:n = 3
輸出:3
輸入:n = 11
輸出:0
題目思考
能否找到什么規(guī)律?
解決方案
思路
觀察序列本身: 0~9 只占 1 位, 共 10 個(gè) 10~99 占 2 位, 共 90 個(gè) 100~999 占 3 位, 共 900 個(gè) 1000~9999 占 4 位, 共 9000 個(gè) ... 為了保持一致, 我們可以將 1 位的時(shí)候改成從 1 開(kāi)始, 把 n=0 作為特殊情況, 這樣 1 位也只有 9 個(gè), 即 1~9 這樣我們就很容易發(fā)現(xiàn)規(guī)律, 假設(shè)當(dāng)前位數(shù)是 le: 每一位的開(kāi)始值 start 是 pow(10, le-1)
每一位的數(shù)字?jǐn)?shù)目是 9*start
每一位的字符總數(shù)則是 9*start*le
(因?yàn)槊總€(gè)數(shù)字有 le 個(gè)字符)所以我們可以逐漸增加位數(shù), 統(tǒng)計(jì)當(dāng)前總共的字符個(gè)數(shù) 假設(shè) le 位數(shù)下的字符總數(shù)是 cnt, le+1 下的字符總數(shù)是 nextcnt, 那么如果 n 在 [cnt, nextcnt)
范圍內(nèi), 那就說(shuō)明 n 落在的數(shù)字一定有 le 位這樣一來(lái), 我們只需要定位 n 具體對(duì)應(yīng)到的數(shù)字, 以及所在數(shù)字的第幾位即可 而由于每個(gè)數(shù)字占有 le 位, 所以 n 對(duì)應(yīng)的數(shù)字就是 start+(n-cnt)/le
, 而具體 n 是在該數(shù)字的第幾位, 則是(n-cnt)%le
下面的代碼對(duì)必要步驟有詳細(xì)的解釋, 方便大家理解
復(fù)雜度
時(shí)間復(fù)雜度 O(logN)
只需要按位數(shù)遍歷即可, n 的位數(shù)是 logN 空間復(fù)雜度 O(1)
只使用了常數(shù)個(gè)變量
代碼
class Solution:
def findNthDigit(self, n: int) -> int:
if n == 0:
return 0
# 初始化計(jì)數(shù)值為1, 因?yàn)閟tart最開(kāi)始是1, 此時(shí)已經(jīng)有1個(gè)字符了
cnt = 1
# 初始化位數(shù)為1位
le = 1
while n >= cnt:
# 求當(dāng)前位數(shù)下的start
start = 10**(le - 1)
# 求當(dāng)前位數(shù)+1情況下的字符總數(shù)
nexcnt = cnt + 9 * start * le
if n <= nexcnt:
# 當(dāng)前n落在范圍內(nèi), 找對(duì)應(yīng)的數(shù)字和該數(shù)字中n對(duì)應(yīng)的位(偏移量)
i, offset = divmod(n - cnt, le)
num = start + i
# 將數(shù)字轉(zhuǎn)成字符串, 其偏移量下標(biāo)對(duì)應(yīng)的位即為所求
return int(str(num)[offset])
# 更新字符總數(shù), 同時(shí)位數(shù)加1, 繼續(xù)循環(huán)
cnt = nexcnt
le += 1
關(guān)于“LeetCode如何找出數(shù)字序列中某一位的數(shù)字”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
當(dāng)前文章:LeetCode如何找出數(shù)字序列中某一位的數(shù)字
新聞來(lái)源:http://fisionsoft.com.cn/article/jejhid.html