谷歌笔试题解析:递推公式解算法题
需积分: 10 196 浏览量
更新于2024-09-01
收藏 18KB TXT 举报
"这篇文本包含了两道谷歌笔试题目及其解答,分别是计算数字中1的个数和寻找集合中满足A+B=C的最大C。"
第一道题目是关于计算一个数字n中1的出现次数。这个问题可以通过递推公式来解决。首先,我们需要确定n的位数L,然后计算出10的L-1次方s。接着,找到n的第一位数字a,即n除以s的结果。递推公式如下:
- 当n小于9时,直接返回n的值,如果n大于0则返回1,否则返回0。
- 对于n大于9的情况,1的总数由三部分组成:
1. 所有数中第一位有多少个1,这部分可以用 `(a>1 ? s : n - s*a + 1)` 来计算。
2. 对应a乘以f(s-1)的1的数量,即a后面所有数中1的总数。
3. 对应f(n-s*a)的1的数量,即去掉最高位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中满足A+B=C的最大C。解决这个问题的方法是首先对集合S进行排序,然后使用双指针法遍历集合。具体步骤如下:
1. 将集合S中的所有元素按照升序排列。
2. 初始化两个指针i和j,分别从集合的末尾和开头开始,同时初始化一个k指针指向i-1的位置。
3. 在每次循环中,检查Xj+Xk是否大于Xi,如果是,则减小k;如果小于Xi,则增大j。如果相等,说明找到了满足条件的A、B、C,其中A=Xj,B=Xk,C=Xi,此时可以退出循环。
4. 如果遍历完所有可能的组合都没有找到满足条件的A、B、C,那么说明不存在这样的C。
例如,对于集合S = {1, 4, 7, 10, 11, 13, 15, 18, 34},我们首先排序得到S = {1, 4, 7, 10, 11, 13, 15, 18, 34},然后进行双指针遍历,可以找到最大的C=34,对应的A=1,B=33,满足A+B=C。
这两道题目都是典型的算法问题,通过递推和双指针技术,我们可以有效地解决问题。这样的练习对于提升编程思维和解决实际问题的能力有很大帮助,特别是在面试和笔试中。
2009-10-31 上传
2021-08-25 上传
2023-12-03 上传
2023-12-27 上传
2023-05-25 上传
2023-05-19 上传
2023-06-08 上传
2024-10-30 上传
ToF君
- 粉丝: 835
- 资源: 100
最新资源
- 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 图片组合的开发部署记录