題目描述
輸入乙個整數 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出現...