數字以0123456789101112131415…
的格式序列化到乙個字串行中。在這個序列中,第5
位(從下標0
開始計數)是5
,第13
位是1
,第19
位是4
,等等。
請寫乙個函式,求任意第n
位對應的數字。
示例 1:
輸入:n = 3示例 2:輸出:3
輸入: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
0n)
也即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
0n)
的,因為在二進位制表示中取某一位可以每次右移1
位(即除以2
),所以是 o(l
og2n
)o(log_2n)
o(log2
n)級別的,同理在十進位制中取某一位可以每次右移1
位(即除以10
),所以是o(l
og10n
)o(log_n)
o(log1
0n)
級別的
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...