求出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希望你們幫幫他...