求数字序列中的第n位对应的数字
文章目錄
- 題目
- 思路
- 代碼
- 復(fù)雜度分析
- 致謝
題目
數(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ù)字。
思路
我們注意到,如果:
可以得到下表(個(gè)位數(shù)不計(jì)入0):
| 1~9 | 1 | 9 | 9 |
| 10~99 | 2 | 90 | 180 |
| 100~999 | 3 | 900 | 2700 |
| …… | …… | …… | …… |
| start~end | digit | 9*start | 9 * start * digit |
可以得到三個(gè)公式:
我們可以將求 第n位對(duì)應(yīng)的數(shù)字 求解過(guò)程分為以下幾步:
第一步:
在幾位數(shù)的范圍內(nèi)?
while(n>count){n -= count;start *= 10;digit++;count = 9*start*digit; }第二步:
是哪個(gè)數(shù)字?
int num = start+(n-1)/digit;為什么是 (n-1)/digit 而不是 n/digit ?
首先看一張圖:
以?xún)晌粩?shù)為例,當(dāng)執(zhí)行完 n=n-9 之后,n 與各個(gè)兩位數(shù)數(shù)位的對(duì)應(yīng)關(guān)系如上圖所示。以13為例,當(dāng)我們知道 n=7(13中的1) 時(shí),由 n/2=3 可得 n 是十位數(shù)起始數(shù)字之后的第三個(gè),但是當(dāng) n=8(13中的3) 時(shí),由 n/2=4 得到 n 對(duì)應(yīng)的是十位數(shù)起始數(shù)字之后的第四個(gè),這是錯(cuò)誤的,十位數(shù)起始數(shù)字之后的第四個(gè)是 14 而非 13 ,因此計(jì)算時(shí)需要將 n 進(jìn)行 減一操作,因?yàn)槲覀儗⑵鹗紨?shù)字看作 第0個(gè)數(shù) 而非 第1個(gè)數(shù) 。
為什么是 (n-1)/digit 而不是 n/digit-1?
仍然以?xún)晌粩?shù)為例,當(dāng) n 對(duì)應(yīng)非起始數(shù)字時(shí),兩種算法是沒(méi)有區(qū)別的,但是當(dāng) n 對(duì)應(yīng)起始數(shù)字時(shí),不論 n=0 or n=1 , (n-1)/digit 的計(jì)算結(jié)果都為 0 ,而 n/digit-1 的計(jì)算結(jié)果都為 -1 。 (n-1)/digit 對(duì)應(yīng)的數(shù)字 num = start + 0 = 10 ,正確;而 n/digit-1 對(duì)應(yīng)的數(shù)字 num = start + (-1) = 9 ,變成了個(gè)位數(shù),錯(cuò)誤。
總而言之,對(duì) n 進(jìn)行 減一操作 是因?yàn)?起始數(shù)字應(yīng)視為 start + 0,雖然它是兩位數(shù)里面的 第一個(gè) 數(shù)字,但是我們?cè)诠嚼镎f(shuō)的 第幾個(gè) 是 該數(shù)字相對(duì)于起始數(shù)字 而言的,因此要統(tǒng)統(tǒng)減一。而之所以不是 先除再減 而是 先減再除 是因?yàn)?要考慮邏輯順序?qū)ζ鹗紨?shù)字的影響 。
第三步:
處于對(duì)應(yīng)數(shù)字的哪一位?
num = s[(n-1)%digit] - '0';(n-1)%digit 計(jì)算的便是對(duì)應(yīng)的 數(shù)位 ,n減一的原因和第二步中相同,不再贅述。
代碼
class Solution { public:int findNthDigit(int n) {long long start=1, count=9, digit=1;while(n>count){n -= count;start *= 10;digit++;count = 9*start*digit;}int num = start+(n-1)/digit;//所在數(shù)字string s = to_string(num);num = s[(n-1)%digit] - '0';//處于所在num的哪一位return num;} };復(fù)雜度分析
時(shí)間復(fù)雜度 O(logn) : 所求數(shù)位 n 對(duì)應(yīng)數(shù)字 num 的位數(shù) digit 最大為 O(log n) ;第一步最多循環(huán) O(log n) 次;第三步中將 num 轉(zhuǎn)化為字符串使用 O(log n) 時(shí)間;因此總體為 O(log n) 。
空間復(fù)雜度 O(logn) : 將數(shù)字 num 轉(zhuǎn)化為字符串 str(num) ,占用 O(logn) 的額外空間。
致謝
思路中的部分想法、復(fù)雜度分析源于K神的題解,鞠躬致謝。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的求数字序列中的第n位对应的数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何离线安装python的whl库
- 下一篇: Swagger从入门到放弃