給定乙個整數 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出現的次數 ...