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

2021-09-26 21:00:26 字數 2571 閱讀 1197

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

解題思路:

思路1:暴力,原本以為過不了,竟然過了 。。。 

**如下:(都不好意思貼上**了 7^7

class solution 

int ans = 1;

int tol;

for (int i = 2; i <= n; i++)

tol = tol / 10;}}

return ans;

}};

思路2:咳咳,接下來我們用溫柔的解法來解釋這道題目,其實這道題目就是總結找規律的題目,我之前想到的是分別統計每個位數(個位、十位、百位 。。)上「1」的個數,然後求和即可,奈何當時思路不清晰,沒有總結出乙個統一的規律,之後稍加梳理,便可以總結出相應的規律。

首先我們來看個位,

對於個位來說,「1」的出現僅僅是1,11上的個位,21上的個位等等,可以看出1的出現週期是每10個出現一次,因此我們可以通過個位以上的高位數字得到個位上1的個數,同時要注意特殊情況!當數字是20的時候,只出現了2個1,但是十位有進製,因此當個位是0的時候我們需要特殊處理。綜上,我們可以得到個位上出現1的個數為:

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

我們接下來看十位數出現1的個數,十位出現1僅僅是在10~19,110~119。。。這裡把10~19定義為乙個完整的週期,因此我們可以得到,當十位數字大於1時,就會有完整的週期出現,這時十位數字出現1的個數僅僅是由十位的高位數字所就決定;當十位數字等於1時,這時存在乙個不完整的週期,這個不完整週期中1的個數由十位的低位數字決定;當十位數字等於0時,缺少乙個完整週期。綜上,可以得到十位數字出現1的個數為,

下面我們繼續來看百位,有了十位做鋪墊,我們很容易就可以推導出百位上1出現的個數,即當百位數字大於1,有完整的整週期,由高位數字決定整週期的數目;當百位數字等於1,存在不完整週期,由低位數字決定不完整週期中1的個數;當百位數字等於0,缺少乙個完整週期,綜上,可以得到百位數字上1出現的個數,

這時我們已經發現了規律,把個位的計算公式也寫成通式的形式,即,

綜上,我們可以得到這個題的答案是:

看牛客網的大神覺得太多的if-else讓**變得複雜,所以想把判斷語句改為更簡單的形式,即當不完整週期出現的時候選擇不完整週期,不完整週期不存在的時候(為負數或i)選擇0 或 i,具體表示式如下:

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

按照這個思路寫的**如下:

class solution 

int ans = 0;

for (int i = 1; i <= n; i = i * 10)

else

}else

else

}ans += n/dri*i;

}return ans;

}};

思路3:研究思路2的推導,我們發現不論是否存在不完整週期,1的個數都由當前位數的高位決定整體數目,低位決定不完整週期的1的個數,因此對n進行分割,分為兩部分,高位n/i,低位n%i

當i表示百位,且百位對應的數》=2,如n=31456,i=100,則a=314,b=56,此時百位為1的次數有a/10+1=32(最高兩位0~31),每一次都包含100個連續的點,即共有(a%10+1)*100個點的百位為1

當i表示百位,且百位對應的數為1,如n=31156,i=100,則a=311,b=56,此時百位對應的就是1,則共有a%10(最高兩位0-30)次是包含100個連續點,當最高兩位為31(即a=311),本次只對應區域性點00~56,共b+1次,所有點加起來共有(a%10*100)+(b+1),這些點百位對應為1

當i表示百位,且百位對應的數為0,如n=31056,i=100,則a=310,b=56,此時百位為1的次數有a/10=31(最高兩位0~30)

綜合以上三種情況,當百位對應0或》=2時,有(a+8)/10次包含所有100個點,還有當百位為1(a%10==1),需要增加區域性點b+1

這裡補8非常巧妙,是因為當百位為0,則a/10==(a+8)/10,當百位》=2,補8會產生進製位,效果等同於(a/10+1)。

**如下:

int count=0;

long long i=1;

for(i=1;i<=n;i*=10)

return count;

}};

其實通過思路2和思路3的分析,我們不僅可以得到1的個數,也可以得到數字1~9任意乙個數字出現的次數,同時數字0情況比較特殊,需要單獨進行分析。

參考資料: 牛客網

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

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

整數中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希望你們幫幫他...