劍指 JZ31整數中1出現的次數

2021-10-08 22:18:17 字數 1507 閱讀 4057

題目描述

輸入乙個整數 n ,求1~n這n個整數的十進位制表示中1出現的次數。

例如,輸入12,1~12這些整數中包含1 的數字有1、10、11和12,1一共出現了5次。

示例 1:

輸入:n = 12

輸出:5

示例 2:

輸入:n = 13

輸出:6

解題思路

該方法依次計算個位,十位,百位到最高位的1出現的次數。

1. 比如計算十位,這裡以n = 204為例,cur表示當前位為0,hight表示高位,這裡為2,digit表示進製,十位則digit為10, 所以十位為1的數就為10~119,這裡可以直接數出來,為[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 110, 111, 112, 113,114,115,116,117,118,119],總共有20個數,可以直接通過high * digit計算得出,其他的數也一樣。

2. 還是計算十位,這裡如果n=214,當前位cur = 1,高位high = 2,低位low = 4, digit還是為10, 所以十位為1的數為10~214,數出來就是[10,11,12,13,14,15,16,17,18,19,110,111,112,113,114,115,116,117,118,119,210,211,212,213,214],總共25個數字,那麼可以推算為high * digit + low + 1

3. 同理,如果n = 254,當前位cur = 5, 高位high = 2, 低位low = 4, digit為10, 十位為1的數為10~219,數出來就是[10,11,12,13,14,15,16,17,18,19,110,111,112,113,114,115,116,117,118,119,210,211,212,213,214,215,216,217,218,219],總共30個數字,可以推算為(high + 1) * digit 

所以從個位開始進行遍歷,初始時digit為1。

class solution:

def numberof1between1andn_solution(self, n):

digit, res = 1, 0

high, cur, low = n // 10, n % 10, 0

while high != 0 or cur != 0:

if cur == 0:

res += high * digit

elif cur == 1:

res += high * digit + low + 1

else:

res += (high + 1) * digit

low += cur * digit

cur = high % 10

high //= 10

digit *= 10

return res

s = solution()

print(s.numberof1between1andn_solution(5))

《劍指Offer》31 整數中1出現的次數

題目 31.整數中1出現的次數 知識點 優化 題目描述 求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快...

劍指offer 31 整數中1出現的次數

1.題目描述求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數 從1 ...

劍指offer JZ31 整數中1出現的次數

求出113的整數中1出現的次數,並算出1001300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數 從1 到 n 中1出現...