读书人

【意趣编程】“至少出现一次7”的数

发布时间: 2012-06-30 17:20:12 作者: rapoo

【趣味编程】“至少出现一次7”的数

班级q群上老师给的题目,突然给出来的,感觉还是蛮喜欢这样的题目的。

前几天,一个朋友参加google总部的一个电话面试。有一道题目很有意思,题目不难,但是挺考程序员的思维的。
给定一个正整数n,写一个算法计算从1到n之间有多少“至少出现一次7”的数。例如n=20,那么有两个出现7的数:7,17。

看了下,应该是组合题没错,脑子里天马行空,凌乱…觉得能找到一个O(N)算法就已经够优了,同学又说有logN的,改天讨论一下。

讨论的时候我有个组合的思路:
比如100
高位不能为7
那么十位为7,那么10种;如果各位为7,那么10种;减去重复的1,故结果是10+10-1=19.可很明显这是有漏洞的,因为如果不全是10的N次方就有很多情况要考虑。

当时嘴大,把“杨辉三角”都给摔出口了。其实组合的题目里经常会用到杨辉三角的,在之前和一个学电子的朋友聊天的时候说到了这个话题,他提出“杨辉三角”的时候,我还纳闷:杨辉三角一直都知道,却没有用到。原来“杨辉三角”有如此美丽的性质。他给我好好上了一课。

陈yin老师立刻怀疑:“杨辉三角”和这个题目有五毛钱的关系吗?- -狠狠的被鄙视了。

晚上十二点多,看完两集《百家讲坛 易中天品三国》,回过头来想这个问题。脑子还是天马行空的,什么动态规划都来了,因为组合问题里也经常有用到动态规划的思维。结果是动态规划是可以解题,因为假如ABCDE五位数,我们可以先算前N位数中有7的个数,然后来推算N+1位数的时候7的个数,但是我不行——绝望了,主要是某位大于7,等于7,小于7的情况没有搞定。

片刻之后有个发现,还是从n=100开始讲起,
从1到100中有7的总数无非:C(2,1)*9^1 + C(2,2)*9^0 = 18+1 = 19。中,相信你也会想到了吧。

推广一下,比如n201,

读书人网 >编程

热点推荐