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

2021-08-09 14:40:27 字數 1240 閱讀 4408

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

這是劍指offer上的一道題。

我一開始的思路,就是看個位數中含有1的個數,十位數中含有1的個數...其實這種想法是錯誤的。就比如乙個三位數345,有3次經過十位數,每次達成100邊經過一次十位數,所以含有的1的個數絕不是僅僅上面提到的那些。

後來在工程數學課上,豁然開朗了,想問題換個角度去想,就像青蛙跳台階的問題一樣,關注的物件從青蛙轉讓台階,問題就變的清晰多了。

解決問題的核心思想是:考慮每一位含有多少個1.

比如乙個五位數abcde,考慮一下百位1的個數。

1.當c=0時,比如這個數為13089,百位1出現時是:100-199,1100-1199,2100-2199.。。。。12100-12199.共出現13*10^2個1.

在每次到達千時,都要經歷一次100-199,而13089共有13個千,所以1便出現了13*10^2次,即高位乘以10的2次方,這個2是由從c是百位決定的。

2.當c=1時,比如這個數為13189,和第一種情況比較,這個在到達13089後,還可以經過乙個新的一千的過程,即13100-13189,所以1出現的時候除了上面的13*10^2,還要加上乙個低位:13*10^2個1+189

3.當c!=1&&c!=2時,比如這個數為13289,和第一種情況比較,這個在到達13089後,還可以經過乙個新的一千的過程,而且與情況二不同的是,這個過程經歷完了,即經歷了乙個完整的13100-13199,所以1出現的次數為:(13+1)*10^2,即(高位+1)*10^2次方。

經過上面的分析,我們便可以把程式寫出來了。需要有三個變數分別 存放當前的位上的值,高位,低位,還需要乙個存放當前是10的幾次冪,完成**如下:

public class solution 

if(n<10)

int i=1;//當前是第幾位

int cur=0;

int pre=0;

int high=0;

int count=0;

while(n/i>0)

else if(cur==1)else

i=i*10;

}return count;

}}

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

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

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

時間限制 1秒 空間限制 32768k 熱度指數 226203 本題知識點 查詢數學 求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他...

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

時間限制 1秒 空間限制 32768k 熱度指數 244020 本題知識點 查詢 數學求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他...