劍指Offer 43 1 n整數中1出現的次數

2021-09-10 05:35:19 字數 1889 閱讀 5523

輸入乙個整數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

n1​0..

.0~ n1n

2...

ni

n_1n_2...n_i

n1​n2​

...n

i​】,2 -【n

10...0

n_10...0

n1​0..

.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 ...