1. 程式人生 > >劍指offer:整數中1出現的次數(從1到n整數中1出現的次數)(Python)

劍指offer:整數中1出現的次數(從1到n整數中1出現的次數)(Python)

題目描述

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

解題思路

這種題型思路到位之後,程式碼實現沒有一點難度。
關於這道題的比較通俗易懂的思路講解在這篇部落格中。

Python程式碼

第一版:

def NumberOf1Between1AndN_Solution(self, n):
    if n < 1:
        return 0
    mult, sumTimes = 1
, 0 while n//mult: div, mod = divmod(n, mult*10) curNum, curMod = divmod(mod, mult) if curNum > 1: sumTimes += div*mult + mult elif curNum == 1: sumTimes += div*mult + curMod + 1 else: sumTimes += div*mult mult = mult*10
return sumTimes

優化版:

def NumberOf1Between1AndN_Solution(self, n):
    mult, sumTimes = 1, 0
    while n//mult > 0:
        high, mod = divmod(n, mult*10)
        curNum, low = divmod(mod, mult)
        if curNum > 1:
            sumTimes += high*mult + mult
        elif curNum == 1:
            sumTimes += high*mult + low + 1
else: sumTimes += high*mult mult = mult*10 return sumTimes

擴充套件版,求整數中X出現的次數(從1到n中個位數X出現的次數)

def NumberOf1BetweenXAndN_Solution(self, n, x):
    mult, sumTimes = 1, 0
    while n//mult > 0:
        high, mod = divmod(n, mult*10)
        curNum, low = divmod(mod, mult)
        if curNum > x:
            sumTimes += high*mult + mult
        elif curNum == x:
            sumTimes += high*mult + low + 1
        else:
            sumTimes += high*mult
        mult = mult*10
    return sumTimes