Google笔试题解析:递推公式解数字1出现次数
4星 · 超过85%的资源 需积分: 19 175 浏览量
更新于2024-09-10
收藏 77KB DOC 举报
"这篇资源主要包含了两道Google的笔试题,一道是要求编写一个函数,计算从1到给定整数n之间1出现的次数,另一道是寻找集合S中最大的C,使得A+B=C,其中A、B、C都在集合S中。资源提供了部分解法,包括递推公式实现的Java代码以及原创的解答思路。"
在这篇资源中,首先讨论的题目是关于计算1出现次数的问题。给定一个正整数n,我们需要找出从1到n的所有数中数字1出现的总数。一种常见的解决方法是通过递推公式来实现。递推公式如下:
- 当n < 9时,直接返回n的值,因为此时n本身就是一个一位数,所以1的个数就是n(如果n > 0)或0(如果n = 0)。
- 对于更大的n,我们可以将其拆分为首位数字a和其余部分n-s*a,其中s是10的n位数减1次方。递推公式为:
- (a>1?s:n-s*a+1):表示所有数中第一位为1的个数。
- a * f(s-1):表示首位数字a乘以去掉首位后的数字1的个数。
- f(n-s*a):表示去掉首位数字a后的数字1的个数。
提供的Java代码实现如下:
```java
long f(long n) {
if (n < 9) return n > 0 ? 1 : 0;
int L = (int) (Math.log10(n) + 1); // 求n的位数
long s = (long) Math.pow(10, L - 1); // 求10的L-1次方
long a = (long) (n / s); // 求n的第一位数字
return (a > 1 ? s : n - s * a + 1) + a * f(s - 1) + f(n - s * a);
}
```
第二道题目是寻找集合S中的最大C。这个问题可以通过排序集合S,然后使用两个指针j和k从两端向中间遍历,比较Xj + Xk与Xi的关系来解决。如果Xj + Xk > Xi,则减小k;如果Xj + Xk < Xi,则增加j。一旦找到满足条件的A、B、C,就可以结束遍历。以下是一个简单的示例:
```markdown
例子:
集合S: 1, 4, 7, 10
- i = 4, j = 0, k = 3 -> Xj + Xk = 1 + 7 > Xi = 10, k-- -> k = 2
- i = 4, j = 0, k = 2 -> Xj + Xk = 1 + 7 = Xi = 10, A = 1, B = 7, C = 10
```
这个资源对于准备Google笔试或面试的IT从业者来说非常有价值,它不仅提供了具体的题目,还包含了解题思路和代码实现,有助于提升算法和问题解决能力。
2010-04-29 上传
156 浏览量
2023-09-19 上传
2021-12-14 上传
2008-11-20 上传
hejianet001
- 粉丝: 6
- 资源: 17
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录