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

2021-09-20 21:51:12 字數 1937 閱讀 6697

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

思路:像類似這樣的問題,我們可以通過歸納總結來獲取相關的東西。

首先可以先分類:

我們知道在個位數上,1會每隔10出現一次,例如1、11、21等等,我們發現以10為乙個階梯的話,每乙個完整的階梯裡面都有乙個1,例如數字22,按照10為間隔來分三個階梯,在完整階梯0-9,10-19之中都有乙個1,但是19之後有乙個不完整的階梯,我們需要去判斷這個階梯中會不會出現1,易推斷知,如果最後這個露出來的部分小於1,則不可能出現1(這個歸納換做其它數字也成立)。

我們可以歸納個位上1出現的個數為:

n/10 * 1+(n%10!=0 ? 1 : 0)

現在說十位數,十位數上出現1的情況應該是10-19,依然沿用分析個位數時候的階梯理論,我們知道10-19這組數,每隔100出現一次,這次我們的階梯是100,例如數字317,分析有階梯0-99,100-199,200-299三段完整階梯,每一段階梯裡面都會出現10次1(從10-19),最後分析露出來的那段不完整的階梯。我們考慮如果露出來的數大於19,那麼直接算10個1就行了,因為10-19肯定會出現;如果小於10,那麼肯定不會出現十位數的1;如果在10-19之間的,我們計算結果應該是k - 10 + 1。例如我們分析300-317,17個數字,1出現的個數應該是17-10+1=8個。

那麼現在可以歸納:十位上1出現的個數為:

現在說百位1,我們知道在百位,100-199都會出現百位1,一共出現100次,階梯間隔為1000,100-199這組數,每隔1000就會出現一次。這次假設我們的數為2139。跟上述思想一致,先算階梯數 * 完整階梯中1在百位出現的個數,即n/1000 * 100得到前兩個階梯中1的個數,那麼再算漏出來的部分139,沿用上述思想,不完整階梯數k199,得到100個百位1,100<=k<=199則得到k - 100 + 1個百位1。

那麼繼續歸納百位上出現1的個數:

後面的依次類推....

我們把個位數上算1的個數的式子也納入歸納式中

完美!歸納式看起來已經很規整了。 來乙個更抽象的歸納,設i為計算1所在的位數,i=1表示計算個位數的1的個數,10表示計算十位數的1的個數等等。

好了,這樣從10到10的n次方的歸納就完成了。

但是有乙個地方值得我們注意的,就是**的簡潔性來看,有多個ifelse不太好,能不能進一步簡化呢? 我們可以把後半段簡化成這樣,我們不去計算i * 2 - 1了,我們只需保證k - i + 1在[0, i]區間內就行了,最後後半段可以寫成這樣

min(max((n mod (i*10))−i+1,0),i)

上面式子,畫個區間圖(結合不等關係)容易看出此規律。

# -*- coding:utf-8 -*-

class solution:

def numberof1between1andn_solution(self, n):

# write code here

if n<1:return 0

count=0

i=1while i<=n:

temp=i*10

count+=(n//temp)*i+min(max(n%temp-i+1,0),i)

i*=10

return count

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

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

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

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

整數中1出現的次數(劍指offer)

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