Google笔试题解析:递推法解决数字1出现次数问题

需积分: 9 14 下载量 109 浏览量 更新于2024-11-17 收藏 89KB DOC 举报
"Google笔试题及解答" 这篇文档包含的Google笔试题目主要涉及算法和数据结构。其中一道题目要求编写一个函数来计算从1到给定整数n之间1的个数,另一道题目则是一个集合内的元素组合问题。 首先,让我们深入探讨第一道题目。这个问题要求我们找出从1到n的所有数中,1作为数字出现的次数。函数`f(n)`实现了这个功能。关键在于找到一个递推公式来避免穷举所有可能的数字。根据提供的代码,递推公式如下: 1. 当n小于9时,直接返回n(如果n大于0)或0(如果n等于0),因为小于9的数中1的个数就是n本身。 2. 对于n大于或等于9的情况,我们需要考虑n的位数(L)、n的第一位数字(a)和10的(L-1)次方(s)。递推公式如下: - `a>1?s:n-s*a+1` 表示所有数的第一位1的总数,分为两种情况:a大于1时,有a的L-1次,a小于1时有n-s*a+1个1。 - `a*f(s-1)` 表示a后面所有数字的1的总数,这部分可以通过递归计算f(s-1)得到。 - `f(n-s*a)` 表示去掉第一位数字后的数中1的总数,同样通过递归计算。 接下来,我们看第二道题目。这是一个经典的集合内的元素组合问题。目标是在集合S中找到最大的C,使得存在A和B,满足A + B = C,同时A、B、C都在集合S中。解决这个问题的方法是首先对集合S进行排序,然后使用双指针策略进行查找。具体步骤如下: 1. 将集合S中的所有元素按升序排序。 2. 从最后一个元素Xi开始遍历(即从大到小),使用两个指针j和k,分别指向第一个元素和Xi-1。 3. 如果Xj + Xk大于Xi,说明当前j和k组合过大,将k向左移动一位,继续尝试。 4. 如果Xj + Xk小于Xi,说明当前j和k组合过小,将j向右移动一位,增加组合的可能值。 5. 这个过程会找到最大的C,使得A + B = C。 这两道题目考察了应聘者的编程思维、算法理解和数学逻辑能力,是Google等科技公司笔试中常见的类型。理解并能够解决这些问题对于准备此类面试至关重要。