1. 程式人生 > 實用技巧 >劍指offer31-整數中1出現的次數

劍指offer31-整數中1出現的次數

題目描述

求出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