這兩天看到一個很有意思的面試題:考官直接問,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,
這兩種情況都算上了77里面的兩個7,因此減去2,結果是22-2=20,
第二步,考慮第一個格子,第一個格子,從0~9,即有10種上述情況,其中7比較特殊,我們先不把它當作7(隔離的思想),那么情況簡單了,一共有10*20 = 200個7,
第三步,考慮剛才被隔離掉的7,這一步容易想歪,覺得是不是+20呢?其實應該仔細想下,701, 719, 722這些都多了1個7,那777呢?仔細想下,777里面的后面2個7也是前面已經算過了,那就很明朗了,就是剛才的隔離,僅僅忽略了從00~99這100個數中前面含一個7的情況,
所以,最后的答案是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次,
這個解法是間接求,比直接求更麻煩了些,
總結
表示方法和分類很重要,多采用隔離法(高中物理最好用的方法之一),可以做到簡化問題,方便分析!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250018.html
標籤:C
上一篇:C/C++編程知識:運算子(六)丨逗號()運算子知識詳解
下一篇:編程的相關概念
