[java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了.
简述经过:
不算hr面,总计四面,第一天前三面, 然后过了一个多星期第四面(领导一般都比较忙~)
平均每一面都是一小时,面完前三面已经很辛苦了.
我之前去美团面试从一面到hr面,总计四面 面了一下午将近四个小时...还不包括来回路程,所以面试是项体力+脑力的活,准备的充分了,面试成功率高少跑几次了~就会轻松不少~大部分同学面试面上几家之后都懒得再跑了.
言归正传,
百度一面没有怎么问技术,主要问了工作内容,一面的面试官可能是负责日志接收相关的工作,问了许多关于日志打点,布码,字段格式,日志测试校验等方面的问题.在之前的工作中都涉及到了,面的不错,而且面试官一点架子没有,面试过程更像一个经验沟通了.
二面应该是个小leader,问了一些java开发必问的基础题:比如: jvm,gc,手写二分查找等.(以后有时间我会详细整理下java基础相关的东西)
三面应该是个大leader,问的问题挺多的,不止是技术上的问题, 算法题问了两道,第一道想不起来了... 第二道是:给定一个数组,求和为定值的所有组合.下文解答. 对了,三面还问了spark相关的问题并且介绍了一下他们组的工作,包括离线数据计算,实时数据计算和数据挖掘等.
三面都已经介绍自己组内的业务了,那肯定是过了,关键看四面了,四面是个经理,(经理思考问题的角度比咱们一般小兵要高~),主要聊了下业务上的东西,和一些遇到的不好解决的问题. 因为都是做数据开发并且都是媒体相关数据所以业务上的共同点还是比较多的,面试者思路较清晰,和经理聊得也不错,最终如愿拿到offer.
给定一个数组,求和为定值的所有组合--思路
这种题首先忽略掉效率最低的穷举法.
给定一个数组arr,求和为定值SUM的所有组合,所有组合并不确定组合里元素的个数,所以可以考虑化繁为简,一步步减少组合的元素个数.递归方式.
例如,去掉第一个元素,求剩下元素中和为SUM-第一个元素的值的所有组合.
剩下的元素中再去掉其中的第一个,求去掉第一个元素的值的所有组合.
依次类推直到剩下元素中的和为0,则之前去掉的元素的组合即为满足条件的一个组合.
java实现代码:
static int[] flag = new int[100];
static int index = 0;// 记录当前
/**
* @param arr 给定的数组
* @param start 开始位置
* @param length 数组长度
* @param sum 给定的值
*/
public static void numGroupAll(int[] arr, int start, int length, int sum) {
if (sum == 0) {
for (int j = 0; j < index; j++) {
System.out.print(flag[j]);
}
System.out.println();
}
else if(sum>0) {
for (int i = start; i < length; i++) {
flag[index++] = arr[i];
//去掉第i个元素,求剩下元素中和为`SUM-第一个元素的值`的所有组合.
SolveProb.numGroupAll(arr, i + 1, length-1, sum - arr[i]);
}
}
index--; //若sum<0 则表示该数不满足条件,需要index--, 因为之前假设该数满足条件 index++找该数下一个数
}
算法改进:
当判断sum - arr[i]是否大于0的时候,如果(sum-arr[i])<0
并且数组中,arr[i+1]及其之后的值都比arr[i]大,
(sum-arr[i+1]那么也肯定<0, 就不需要再继续判断了!节省了大量的效率.
所以改进的方法是,在查找之前先排序,判断的时候如果(sum-arr[i])<0就可以停止此次循环了!
改进代码:
public static void numGroup(int[] arr, int start, int length, int sum) {
if (sum == 0) {
for (int j = 0; j < index; j++) {
System.out.print(flag[j]);
}
System.out.println();
}
else if(sum>0) {
for (int i = start; i < length; i++) {
int temp_sum=sum - arr[i];
if(temp_sum>=0)
{
flag[index++] = arr[i];
SolveProb.numGroup(arr, i + 1, length-1, sum - arr[i]);
}
else //****因为后面的数比这个大,若此时temp_sum小于0,则后面的数更不满足条件,不用再进行循环****
break;
}
}
index--;
// System.out.println(index);
}
测试代码,如下图:

在int[] arr = { 1, 3, 2, 4, 5, 6, 7, 8, 9 };这个例子中,改进算中递归的调用次数是不改进之前的三分之一.大大提高了效率.
[java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.的更多相关文章
- Java大数据人才应用领域广,就业薪酬高
互联网创造了大数据应用的规模化环境,大数据应用成功的案例大都是在互联网上发生的, 互联网业务提供了数据,互联网企业开发了处理软件,互联网企业的创新带来了大数据应用 的活跃,没有互联网便没有今天的大数据 ...
- 如何学好Java大数据并快速提升
Java作为一种最流行的,最热门的编程语言,可以说它无处不在,目前全球有着数十亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天超过数以千万的数据.无论是手机软件.手机Java ...
- JAVA 大数据内存耗用测试
JAVA 大数据内存耗用测试import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean ...
- Java大数据应用领域及就业方向
最难毕业季,2017高校毕业生达到795万,许多学生面临着毕业即失业的尴尬.面对着与日俱增的竞争形势和就业压力,很多毕业生选择去知了堂学习社区镀金,以提高自己的就业竞争力,其中Java大数据是学生选择 ...
- 为什么Java大数据是最火爆的编程语言?
未来10年将是大数据,人工智能爆发的时代,到时将会有大量的企业需要借助大数据,而Java最大的优势就是它在大数据领域的地位,目前很多的大数据架构都是通过Java来完成的. 在这个Android.iOS ...
- 原来Java大数据才是真正的高富帅!
大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇. 国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发.开发程序员的 ...
- 42步进阶学习—让你成为优秀的Java大数据科学家!
作者 灯塔大数据 本文转自公众号灯塔大数据(DTbigdata),转载需授权 如果你对各种数据类的科学课题感兴趣,你就来对地方了.本文将给大家介绍让你成为优秀数据科学家的42个步骤.深入掌握数据准备, ...
- 为什么Java大数据能带你走上人生巅峰
国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发. 开发程序员的工作大多是重复性劳动,容易产生疲惫感,薪资在工作2-5年内就达到了一个峰值,再要提升就比较困 ...
- 2018 年 3 月 iOS 面试总结(上市公司,BAT)
序言: 今年2月中下旬因为个人原因,换了一份工作,3月初期间面试了有3,4家,基本都是D轮或者刚刚上市的公司,也有上榜的BAT,也从他们的面试笔试中看到了自己的一些不足,于是就想写出来和大家分享一下, ...
随机推荐
- kafka集群管理
1.启动kafka集群 kafka 没有提供同时启动集群中所有节点的执行脚本,这里自定义一个脚本 名称为 kafka-cluster-start.sh 2.关闭节点 kafka自带关闭脚本 kafka ...
- 使用GitHub搭建个人博客
博客已经从博客园慢慢搬到GitHub 上,可能在博客园上显示不是很规整,可以移步到另外的一个上面看 Blog 两边博客同时更新. 欢迎各位star 和 follower 搭建过程 在搭建博客时候也踩 ...
- MongoDB框架Jongo的使用介绍
1.Jongo可以用来做什么? Jongo框架的目的是使在MongoDB中可以直接使用的查询Shell可以直接在Java中使用.在官网首页有一个非常简洁的例子: SHELL:这种查询方式是Mo ...
- 探秘小程序(8):scroll-view组件
按照官方文档的例子已经多scroll-view进行了说明,但是案例中没有样式 到时会出现一些问题,比如说,自己写的scroll-x并不能横向滚动,今天就来说一下这个问题: DEMO如下: html: ...
- java - 并发编程易错实例
生产者消费者问题 https://juejin.im/post/5aeec675f265da0b7c072c56 notify()发生在wait()之前会怎么样?怎么处理? wati()等待条件的变化 ...
- 漫画|你还记得原生的JDBC怎么连接数据库吗?
数据表的设计范式 在实际开发中最为常见的设计范式有三个: 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式: 第二范式需要确保数据库表中的每一列都 ...
- HTML--Canvas基础入门
一 HTML5画布基本介绍 1.HTML5专门为画布功能提供的标签:<canvas>,所以画布相关的功能都是基于这个标签来完成的; <canvas id="canvas&q ...
- Push notification - Caused by java.io.IOException toDerInputStream rejects tag
苹果推送 : 文件不是P12文件当生成一个P12,需要选择两个,在钥匙串访问的私钥和证书.
- video自动禁止全屏
在微信浏览器.苹果等其他浏览器,里面使用video标签,会自动变成全屏,改成下面就好了,起码可以在video标签之上加入其他元素 webkit-playsinline playsinline x ...
- 谈谈web上各种图片应用的优缺点
web中承载信息的主要方式就是图片与文字了,以下就是对一些web图片格式的优缺点进行归纳. 1.GIF GIF图是比较古老的web图片格式之一,可以追溯到1987,几乎所有的浏览器都支持这一种格式,老 ...