劍指offer31-整數中1出現的次數
阿新 • • 發佈:2020-12-02
題目描述
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。知識點回顧
查詢、數學
參考:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/
根據當前位 curcur 值的不同,分為以下三種情況:
變數遞推公式:
設計按照 “個位、十位、...” 的順序計算,則 high / cur / low / digithigh/cur/low/digit 應初始化為:
high = n // 10
cur = n % 10
low = 0
digit = 1 # 個位
因此,從個位到最高位的變數遞推公式為:
while high != 0 or cur != 0: # 當 high 和 cur 同時為 0 時,說明已經越過最高位,因此跳出
low += cur * digit # 將 cur 加入 low ,組成下輪 low
cur = high % 10 # 下輪 cur 是本輪 high 的最低位
high //= 10 # 將本輪 high 最低位刪除,得到下輪 high
digit *= 10 # 位因子每輪 × 10
程式碼
# -*- coding:utf-8 -*- class Solution: def NumberOf1Between1AndN_Solution(self, n): # write code here digit=1 cur=n%10 low=0 high=n//10 sum=0 while (cur or high): if cur==0: sum+=high*digit elif cur ==1: sum+=(high*digit+low+1) else: sum+=(high+1)*digit digit*=10 cur=high%10 low=n%digit high=high//10 return sum