這兩天看到一個頗有意思的面試題:考官直接問,1 到 1000 到多少個 7?面試
要求,不編程,直接給出答案,並簡單給出思路。編程
C/C++的學習裙【七一二 二八四 七零五 】,不管你是小白仍是進階者,是想轉行仍是想入行均可以來了解一塊兒進步一塊兒學習!裙內有開發工具,不少乾貨和技術資料分享!工具
首先應該有個合理的歸類,我一開始就想到了一個合理的分類法,即1到1000,每一個數都看做3 位數,而1000明顯沒有7,不考慮那1當作001,19當作019,以此類推 這樣每一個數字能夠用三個格子表示,就有了一個統一的表示方法:學習
口口口開發工具
第一步,只考慮後面兩個格子。我最初只想第一種狀況,X7,即07,17,一直到97,其中先不考慮77的特殊性(隔離的思想),這樣從0~9有10個7,再考慮77,就有11個7。還有一種狀況,7X,即70,71,一直到79,狀況同上,也有11個7。spa
這兩種狀況都算上了77裏面的兩個7,所以減去2。結果是22-2=20。blog
第二步,考慮第一個格子。第一個格子,從0~9,即有10種上述狀況,其中7比較特殊,咱們先不把它看成7(隔離的思想),那麼狀況簡單了,一共有10*20 = 200個7。開發
第三步,考慮剛纔被隔離掉的7。這一步容易想歪,以爲是否是+20呢?其實應該仔細想下,701, 719, 722這些都多了1個7,那777呢?仔細想下,777裏面的後面2個7也是前面已經算過了。那就很明朗了。就是剛纔的隔離,僅僅忽略了從00~99這100個數中前面含一個7的狀況。class
因此,最後的答案是200+100 = 300。進階
假定前面的結果用f(3)表示。
不難概括,1到10000,即f(4) = 10*f(3) + 1000即4000
題目問有多少個7,若是問有多少1,或者2,或者9呢?不難猜測1~9狀況是同樣的。先忽略掉1000裏面多的一個1。
有沒有可能求出有多少個0,而後再求出1~1000這些數字的字符總數,再減去0的個數後,再除以9呢?
第一步:求1~1000這些數字的字符總數
1位數,9個
2位數,90個2 = 180個(1~99有99個,減去9)
3位數,900個3 = 2700個(相似上面10~99,這裏是100~999)
4位數,1*4 = 4
總數是2700+180+9+4 = 2893個字符
第二步:求有多少個0
1位數,沒有
2位數,只考慮X0的狀況,從10~99,有9個
3位數,要考慮0X和X0兩種狀況,各11個,減去重複的2個,即211-2 = 20, 從100~999有9種狀況,即920 = 180個
4位數,3個0
那結果是2700+180+9+4 – 180+9-3 = 2701個 這樣減去1000裏面多的那個1,恰好是2700個了。
那結果好辦了,不考慮這個1,1~9都是出現2700/9 = 300次。
這個解法是間接求,比直接求更麻煩了些。
表示方法和分類很重要,多采用隔離法(高中物理最好用的方法之一),能夠作到簡化問題,方便分析!