輸入乙個整數n,求1~n這n個整數的十進位制表示中1出現的次數。
例:
輸入12,1 ~ 12這些整數中包含1的數字有1、10、11和12,1一共出現了5次。遍歷1~n,每個數字轉換成字串計數1的個數。
時間複雜度:o(nlogn)
空間複雜度:o(1)
將1~n分段,分別處理。num
=n1n
2...
.n
inum = n_1n_2....n_i
num=n1
n2
....
ni,分割成1 -【n
10...0
n_10...0
n10..
.0~ n1n
2...
ni
n_1n_2...n_i
n1n2
...n
i】,2 -【n
10...0
n_10...0
n10..
.0~ 10...0
10...0
10...0
】,3 -【1
11 ~ 10...0
10...0
10...0
】。對於 3,1的數量可以直接計算得到;對於2,只要考慮n
1n_1
n1是否大於1,對於1,則遞迴處理即可。
時間複雜度:o(logn)
空間複雜度:o(logn)遞迴深度
def
number_of_1
(n):
"""
:param n: max number
"""count =
0for i in
range(1
, n+1)
: count +=
str(i)
.count(
'1')
return count
def
number_of_1_2
(n):
""" :param n: max number
"""num =
str(n)
first_digit =
int(num[0]
) length =
len(num)
if length ==
1and first_digit ==0:
return
0if length ==
1and first_digit >1:
return
1if first_digit >1:
count_fisrt_digit =
10**
(length-1)
else
: count_fisrt_digit =
int(num[1:
])+1
count_other_digit = first_digit *
(length -1)
*10**(length -2)
count_rec_digit = number_of_1_2(
int(num[1:
])) count = count_fisrt_digit + count_other_digit + count_rec_digit
return count
給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。
示例:
輸入: 13輸出: 6
解釋: 數字 1 出現在以下數字中: 1, 10, 11, 12, 13 。
劍指offer 43 1 n整數中 1出現的次數
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。思路1 算出數字n...
劍指offer43 1 n整數中1出現的次數
1 n整數中1出現的次數 這個題目暴力解決貌似可以通過,但時間複雜度太大了。比如數字21345,可以把他分為2段,1 1345 1346 21345 先看1346 21345,因為最高位是2,大於1,因此,只看最高位的話,1出現的次數就是10000 19999,即10000次 看低位,我們發現包括1...
劍指offer 43 1 n整數中1出現的次數
輸入乙個整數 n,求 1 n 這 n 個整數的十進位制表示中 1 出現的次數 例如,輸入12,1 12這些數中包含 1 的數字有 1 10 11 12,其中 1 一共出現了5次 暴力解法 class solution return res 利用數學公式計算 首先 依次類推,從 1,10i 1,10 ...