44 數字序列中某一位的數字

2021-10-21 13:52:00 字數 3229 閱讀 7382

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

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

示例 1:

輸入:n = 3

輸出:3

示例 2:

輸入:n = 11

輸出:0

限制:0 <= n < 2^31注意:本題與主站 400 題相同:

首先我們知道的是,1位數有10個,2位數有90個,3位數有9 * 100個,4位數有9 * 1000個,以此類推,如下表

數字範圍

數量位數

佔多少位

1 ~ 991

910 ~ 99902

180100 ~ 999

9003

2700……

……假如我們需要求的是序列的第1001位是什麼,我們可以發現1001 > 9,所以第1001位肯定在1~9這九位數字之後,接下來我們又發現(1001 - 9) > 180,所以第1001位也不可能是乙個兩位數中的某位,而(1001 - 9 - 180)< 2700,因此可以斷定序列的第1001位是乙個三位數中的某一位。

現在已經知道了序列的第1001位是乙個三位數中的某一位,那到底是哪乙個三位數呢,很簡單,計算方法為(1001 - 9 - 180)/ 3向上取整,即100 + ((1001 - 9 - 180 + 3 - 1)/ 3 ) - 1= 370。看下方注1中的上取整公式即可。

好的,現在也知道了它是屬於370的某位的,那到底是哪一位,求餘就好了(1001 - 9 - 180)% 3 = 2;所以答案是370中的第二位,即7

注1:n / i上取整的公式為(n + i - 1)/ i

原因:

注2:題目中第幾位是從0開始計數的,即第0位,第1位,第2...,而我們上面例子剛好也是從0開始計數,即0就是第0位,1就是第1位,也就是說,題目中表達的第1001位指的就是我們**中從1開始計數的第1001位。

總結上述過程為:

時間複雜度:o(l

og10n

)o(log_n)

o(log1

0​n)

也即o(lo

gn)o(logn)

o(logn

) 總的時間複雜度即三步操作的時間複雜度

int的範圍 2∗1

092∗10^9

2∗10

9,所以最多是10位數,因此第一步操作的時間最多是log

10n=10

log_n = 10

log10​

n=10

次,是 o(1

)o(1)

o(1)

的時間複雜度,第二步除法向上取整,也是 o(1

)o(1)

o(1)

的,第三步求是第幾位數字是 o(l

og10n

)o(log_n)

o(log1

0​n)

的,因為在二進位制表示中取某一位可以每次右移1位(即除以2),所以是 o(l

og2n

)o(log_2n)

o(log2

​n)級別的,同理在十進位制中取某一位可以每次右移1位(即除以10),所以是o(l

og10n

)o(log_n)

o(log1

0​n)

級別的

class

solution

//2.看它是幾位數的第幾個數,然後就可以知道它的數值了(n + i - 1) / i為n/i上取整公式

long num = base +

(n + i -1)

/ i -1;

//3.確定屬於那個數的第幾位

//求餘數即可,r = 0 表示是最後一位(也就是 i,幾位數就是幾),r != 0,則r是幾就是第幾位

long r = n % i ==

0? i : n % i;

//取出num的第r位,去掉後面的i - r位即可

//如12345的第三位,後面還有兩位45,我們將這兩位去掉才好取出順數的第三位

for(

int j =

1; j <= i - r;j++

)return

(int

)num %10;

//取出現在的個位就是我們的結果

44 數字序列中某一位的數字

數字以0123456789101112131415 的格式序列化到乙個字串行中。在這個序列中,第5位 從0開始計數 是5,第13位是1,第19位是4,等等。請寫乙個函式,求任意第n位對應的數字。最常規的做法 從0開始對每個數字求位數個數並累加,直至n位於累加的範圍內,由此再具體求第n位對應的數字。常...

數字序列中某一位的數字

面試題44 數字序列中某一位的數字 題目 數字以0123456789101112131415 的格式序列化到乙個字串行中。在這 個序列中,第5位 從0開始計數 是5,第13位是1,第19位是4,等等。請寫一 個函式求任意位對應的數字。static int digit at uint32 t inde...

數字序列中某一位的數字

012345678910.序列中,第n位數 def solution n if n 0 return 1 if n 10 return n i 2 確定是第幾位數 sums 10 ret 0while true 一位數 0 9 共10個字元 兩位數 10 99 共180個字元 三位數 100 999...