这两天看到一个颇有意思的面试题:考官直接问,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次。
这个解法是间接求,比直接求更麻烦了些。
表示方法和分类很重要,多采用隔离法(高中物理最好用的方法之一),能够作到简化问题,方便分析!