中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何找出數字序列中某一位的數字

發布時間:2021-12-15 14:16:29 來源:億速云 閱讀:107 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關LeetCode如何找出數字序列中某一位的數字,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

題目描述

數字以 0123456789101112131415…的格式序列化到一個字符序列中。在這個序列中,第 5 位(從下標 0 開始計數)是 5,第 13 位是 1,第 19 位是 4,等等。

請寫一個函數,求任意第 n 位對應的數字。

  • 0 <= n < 2^31
             

題目樣例

示例

  • 輸入:n = 3

  • 輸出:3

  • 輸入:n = 11

  • 輸出:0

             

題目思考

  1. 能否找到什么規律?
             

解決方案

             

思路

  • 觀察序列本身:
    • 0~9 只占 1 位, 共 10 個
    • 10~99 占 2 位, 共 90 個
    • 100~999 占 3 位, 共 900 個
    • 1000~9999 占 4 位, 共 9000 個
    • ...
  • 為了保持一致, 我們可以將 1 位的時候改成從 1 開始, 把 n=0 作為特殊情況, 這樣 1 位也只有 9 個, 即 1~9
  • 這樣我們就很容易發現規律, 假設當前位數是 le:
    • 每一位的開始值 start 是                  pow(10, le-1)
    • 每一位的數字數目是                  9*start
    • 每一位的字符總數則是                  9*start*le (因為每個數字有 le 個字符)
  • 所以我們可以逐漸增加位數, 統計當前總共的字符個數
  • 假設 le 位數下的字符總數是 cnt, le+1 下的字符總數是 nextcnt, 那么如果 n 在                 [cnt, nextcnt)范圍內, 那就說明 n 落在的數字一定有 le 位
  • 這樣一來, 我們只需要定位 n 具體對應到的數字, 以及所在數字的第幾位即可
  • 而由于每個數字占有 le 位, 所以 n 對應的數字就是                 start+(n-cnt)/le, 而具體 n 是在該數字的第幾位, 則是                 (n-cnt)%le
  • 下面的代碼對必要步驟有詳細的解釋, 方便大家理解
             

復雜度

  • 時間復雜度                 O(logN)
    • 只需要按位數遍歷即可, n 的位數是 logN
  • 空間復雜度                 O(1)
    • 只使用了常數個變量
             

代碼

class Solution:
    def findNthDigit(self, n: int) -> int:
        if n == 0:
            return 0
        # 初始化計數值為1, 因為start最開始是1, 此時已經有1個字符了
        cnt = 1
        # 初始化位數為1位
        le = 1
        while n >= cnt:
            # 求當前位數下的start
            start = 10**(le - 1)
            # 求當前位數+1情況下的字符總數
            nexcnt = cnt + 9 * start * le
            if n <= nexcnt:
                # 當前n落在范圍內, 找對應的數字和該數字中n對應的位(偏移量)
                i, offset = divmod(n - cnt, le)
                num = start + i
                # 將數字轉成字符串, 其偏移量下標對應的位即為所求
                return int(str(num)[offset])
            # 更新字符總數, 同時位數加1, 繼續循環
            cnt = nexcnt
            le += 1
         

關于“LeetCode如何找出數字序列中某一位的數字”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高阳县| 沙洋县| 太白县| 英超| 梁山县| 宁明县| 夹江县| 千阳县| 普宁市| 怀远县| 正定县| 镇康县| 安阳县| 涞水县| 林周县| 鸡泽县| 郧西县| 南华县| 高阳县| 嘉善县| 江口县| 怀安县| 丽水市| 冕宁县| 天镇县| 句容市| 东安县| 青神县| 略阳县| 达州市| 南岸区| 湖北省| 永定县| 白山市| 安国市| 大埔区| 贵港市| 潍坊市| 兰坪| 沂水县| 庆元县|