【leetcode刷題】T199-第N個數字
- 2019 年 11 月 24 日
- 筆記
木又連續日更第62天(62/100)
木又的第199篇leetcode解題報告
數學
類型第15篇解題報告
leetcode第400題:第N個數字
https://leetcode-cn.com/problems/nth-digit
【題目】
在無限的整數序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 個數字。
注意: n 是正數且在32為整形範圍內 ( n < 231)。
示例 1: 輸入: 3 輸出: 3 示例 2: 輸入: 11 輸出: 0 說明: 第11個數字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
【思路】
本題的第n個數,是將所有數排成一排,按位選取的一個數,概述肯定小於10。
我們可以找到規律:
小於10的一位數,共有9個;
小於100的兩位數,共有90個;
小於1000的三位數,共有900個;
……
因此,不斷循環判斷:
i = 0 while n > 0: n -= (i+1) * 9 * (10 ** i) i += 1
當n退出循環,則滿足條件的數在9 * (10 ** (i-1)) 到9 * (10 ** i)之間。
怎麼判斷具體是哪一個數呢?
自然數為9 * (10 ** (i-1)) + (n – 1) // (i + 1)
該自然數的第(n-1) % (i+1)位。
(i+1表示自然數的位數)
【代碼】
python版本
class Solution(object): def findNthDigit(self, n): """ :type n: int :rtype: int """ # 一位數 9 # 兩位數 (99-9) * 2 # 三位數 900 * 3 if n < 10: return n x = 1 n -= 9 while n > 0: n -= (x + 1) * 9 * (10 ** x) x += 1 x -= 1 n += (x+1) * 9 * (10 ** x) res = 10 ** x + (n-1) // (x+1) p = (n-1) % (x+1) print(res, p) return int(str(res)[p])
前一篇文章:T198-整數替換