233 數字1的個數

2021-09-11 06:15:03 字數 1167 閱讀 2286

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。

示例:

輸入:13輸出:6解釋:數字 1 出現在以下數字中: 1, 10, 11, 12, 13 。
最開始想到的是暴力,但是暴力應該是過不了的。

即是:把每乙個數字的裡1的個數都算出來再加起來就是答案

後來我改進了一下,但是還是超出時間和空間了。#最後乙個測試用例是 n = 999999999

class solution(object):

def countdigitone(self, n):

""":type n: int

:rtype: int

"""lis = [0,1,0,0,0,0,0,0,0,0]

if n < 10:return lis[n]

再後來去看別人的想法。

他們的意思是,計算每一位上的數字對1的貢獻。

比如說 223 。

百位上對1的貢獻應該是100,101,102,...,199(百位上是1的數字有100個)

十位上對1的貢獻應是10,11,12,...,19,110,111,...,119,210,211,212,...,219(然後有30個)

個位上對1的貢獻:1,11,21,31,...,91,101,111,...,191,201,211,221(有23個)

所以1到223的所有數字裡1的個數是100+30+23 = 153個

class solution(object):

def countdigitone(self, n):

""":type n: int

:rtype: int

"""count = 0

high = n

cur = 0

b = 1

while(high>0):

cur = high%10

high /=10

count +=high*b

if cur == 1:

count += n%b + 1

elif cur > 1:

count += b

b*=10

return count

參考blog:

233 數字 1 的個數

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。示例 輸入 13 輸出 6 解釋 數字 1 出現在以下數字中 1,10,11,12,13 思路 統計出每一的位上1出現的個數,累加起來就是1出現的總個數。num 31456 現在統計百位上1出現的次數。將num分成兩部分 根據...

233 數字 1 的個數

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。示例 輸入 13 輸出 6 解釋 數字 1 出現在以下數字中 1,10,11,12,13 遞迴解決。分為首位為1和首位不為1兩種情況 1.首位為1,如12345。先考慮大於等於10000的 則10000 12345的首位1共貢...

233 數字 1 的個數 hard

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。示例 輸入 13 輸出 6 解釋 數字 1 出現在以下數字中 1,10,11,12,13 分別計算在個十百千。位上1出現的次數 在某個位置上如果是0,那麼1出現的次數 它的高位x它的位數 如果某個位置上是1,那麼1出現的次數 ...