【題目】
給定乙個整數n,返回1到n的數字中1出現的個數。
例如:
n = 5,1~n為1,2,3,4,5。那麼1出現了1次,所以返回1。
n = 11,1~n為1,2,3,4,5,6,7,8,9,10,11。1出現了4次,返回4。
【基本思路】
方法一。暴力的方式,逐個檢查每個數字中1的個數,十進位制的整數n有logn位,所以考察乙個整數含有多少個1的代價是o(logn),一共有n個數,所以時間複雜度為o(nlogn)。
#python3.5
defonenums1
(num):
if num < 1:
return
0 res = 0
for i in range(1, num+1):
cur = i
tmp = 0
while cur != 0:
if cur % 10 == 1:
tmp += 1
cur //= 10
res += tmp
return res
方法二。觀察所有數字中1出現的規律。以數字12345為例,將12345分成1~2345,2346~12345兩段,先看2346~12345這一段。首先看萬位1出現的次數,只能是10000~12345,一共2345+1個。接下來看千位1出現的次數,那就是千位固定1不動,其他位自由變化,萬位能變化的範圍是0~1,但是區間是2346~12345,所以只能表達1w個數,個十百位能變化的範圍是0~9,所有總的個數是1*10*10*10;同樣百(十)位1出現的次數,那就是百(十)位固定1不動,其他位自由變化,總的個數也是1*10*10*10。因此2346~12345上1出現的次數便可知。接下來1~2345上1出現的次數可以按照上述方法遞迴求解。
這是以1開頭的數字的情況,如果不是以1開頭,那麼最高位1出現的情況就是10000…~19999…
def
onenums2
(num):
defgetlength
(num):
res = 0
while num != 0:
res += 1
num //= 10
return res
if num < 1:
return
0 length = getlength(num)
base = int(math.pow(10, length-1))
first = num // base
firstonenum = num % base + 1
if first == 1
else base
otheronenum = first * (length-1) * (base // 10)
return firstonenum + otheronenum + onenums2(num % base)
分析**可知,n共有多少位,遞迴函式就會被呼叫多少次,即logn次。每次遞迴內部的複雜度也是logn,所以總體時間複雜度為o(logn*logn)。 1到n整數中1出現的次數
1.分析 如果 n 12 即 1 12 中含有1 的數有 1 10 11,12 則1出現的次數為 5 假如計算 1 31245 怎麼計算 第一步 分為兩段 1245 和 1246 31245 第兩步 分別計算這兩段中1出現的次數,最後結果相加 首先計算1246 31245 這一段的1出現的次數 三種...
整數1到n中1出現的次數
比如求出1 13的整數中1出現的次數,1 13中包含1的數字有1 10 11 12 13因此共出現6次,把問題更加普遍化,求出任意非負整數區間中1出現的次數 從1 到 n 中1出現的次數 參考自部落格 按位依次計算,計算出現在個位上1的次數,十位上1的次數.對於某一位的1的個數如此計算,比如對980...
整數中1出現的次數(從1到n整數中1出現的次數)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...