1. 程式人生 > >LeetCode刷題值400Python第N個數字

LeetCode刷題值400Python第N個數字

題目:

在無限的整數序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 個數字。

注意:
是正數且在32為整形範圍內 ( n < 231)。

示例 1:

輸入:
3

輸出:
3

示例 2:

輸入:
11

輸出:
0

說明:
第11個數字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 裡是0,它是10的一部分。

參考解答:

https://blog.csdn.net/IT_job/article/details/80419971

這道題就是要找規律。
        個位數:1-9,一共9個,共計9個數字
        2位數:10-99,一共90個,共計180個數字
        3位數:100-999,一共900個,共計270個數字
        4位數,1000-9999,一共9000個,共計36000個數字  36000=4*9*10**(4-1)
        ......

class Solution(object):
    def findNthDigit(self, n):
        """
        :type n: int
        :rtype: int

        """
        #第一步確定n是在幾位數裡,第二步是確定在幾位數的第幾位數字的第幾位
        #第一步
        digit=1#位數
        while n>digit*9*10**(digit-1):
            n-=digit*9*10**(digit-1)#減去該位數的數字數目再算下一位
            digit+=1
        #第二步,這時的n已經是從這個幾位數的開頭開始的n了
        a=int((n-1)/digit)#得到幾位數的第幾位數字,序號從0開始,所以是(n-1)
        b=int((n-1)%digit)#得到幾位數的第幾位數字的第幾位
        num=10**(digit-1)+a#得到第幾位數字是多少
        res=list(str(num))[b:b+1]#數字轉字元再轉列表把第幾位數的第幾位切出來
        return int(''.join(res))#列表轉字元再轉數字