劍指offer系列 從1到n中1出現的次數

2021-07-11 02:49:22 字數 1198 閱讀 3154

題目描述:

輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數

示例:

輸入12,則包含1的數字有1, 10 ,11 ,12,1共出現5次

輸出5  

分析:

1. 當從1開始向n遍歷每個整數,對每個整數的每一位進行判斷時,效率非常低。

2. 首先分析1346到21345中1出現的次數。可以分為兩種情況:

1)高位為1。其中又包含1只出現在高位,和其它低4位也包含1的情況   

2)高位不是1       

3. 另一種更簡單的方法,分析數字的規律

假設n為乙個4位數abcd,以十位上為例進行分析:

當c=0時,n=ab0d,則可能的情況有高位為0~(ab-1)、個位為0~9,即總共可能的情況有(ab*10)種;

當c=1時,則還要在ab *10的基礎上加上ab10~ab1d這(d+1)種情況,即共有ab *10 + (d+1)種。

當c>1時,則可能的情況為高位為0~ab、個位為0~9,共(ab+1) *10種情況。

以此類推,百位為1的情況有:

a*100 (b=0)

a*100 +(cd+1) (b=1)

(a+1)*100 (b>1)

總結:

設m=1 ,10 ,100 ,……,

a=n/m,b=n%m,

則m位包含1的個數為 :

(a/10)*m (a%10 =0 )

(a/10)*m + (b+1) (a%10 =1)

(a/10 + 1)* m (a%10 > 1)

最後可歸納為:((a+8)/10) * m + (a%10==1?(b+1):0)

(a+8)/10用於判斷乘以m時是否需要加1

**:

int countdigitone(int n) 

return ones;

}

《劍指offer》系列 1

最近一直在看劍指offer,這上面的題目都是比較考察程式設計能力的,打算做個記錄,把寫過的 儲存下來 1.實現乙個string類 面試官的考察點應該在以下幾點 1.模板類的書寫 2.對於賦值函式考察的幾點 1 是否返回引用,因為只有返回引用,才能連續的進行賦值 2 引數是否是常量 3 是否是自身賦值...

劍指offer 列印從1到最大的n位數

輸入數字n,按順序列印出從1最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的3位數即999。因為題目沒有說明數在什麼範圍內,所以這是乙個大數問題,模擬加一或者用全排列來做 解法一 void print1tomaxofndigits int n bool addone int numb...

劍指offer列印從1到最大的n位數

輸入數字 n,按順序列印出從 1 到最大的 n 位十進位制數。比如輸入 3,則列印出 1 2 3 一直到最大的 3 位數 999d1,double d2 注意強制轉換為int int count int math.pow 10,n class solution return ans 觀察可知,生成的...