[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,也从他们的面试笔试中看到了自己的一些不足,于是就想写出来和大家分享一下, ...
随机推荐
- java 面试基础总结(二)---多线程
1.实现多线程的三种方法 1.继成Thread 类,覆盖run()方法即可 2.implements Runnable接口 3.implements Callale接口,执行时通过FutureTask ...
- solr入门
Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...
- 简单的端口扫描器(TCP connect)
端口扫描器原理相对简单,采用的是TCP connect状态判断.具体来说:TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭.该方式扫描 ...
- (转)创建GitHub技术博客
https://blog.csdn.net/renfufei/article/details/37725057
- IDEA配置maven(配置阿里云中央仓库)
前言 idea配置maven后如果不修改中央仓库地址创建maven则出奇的慢,不管你用MyEclipse还是idea都慢的不要不要的,实在不能忍受. 这种条件下发现一个阿里云中央仓库来点福利,有福利了 ...
- ppt提取文字
ALT+F11调出开发窗口 加入引用 插入模块 输入代码运行 Sub Main() On Error Resume Next Dim temp As New Word.Document, tmpSha ...
- Java学习笔记之——break 和continue
break:(中文翻译:打断) 可以使用在switch和循环结构中 表示的含义:立刻结束当前switch或者或者循环结构 continue:(中文翻译:继续) 只可以使用在循环结构中 表示含义:结束本 ...
- ngx-echarts响应式图表
一.代码 html代码 <!-- html --> <nz-card style="background-color: #0e0b2a;border: 0px;color: ...
- 2017-07-29 中文代码示例教程之Java编程一天入门
Java编程一天入门 v0.0.1 alpha 共享协议 本作使用署名-非商业使用-禁止演绎协议共享. 前言 Java入门代码用中文写(举例如下)更能被新手理解. 由于至今没有看到类似教程, 在此抛砖 ...
- 【读书笔记】iOS-如何推销你的Web应用
1,利用Beta测试来邀请测试者. 2,利用新闻发布. 3,创建Web应用的宣传网站. 4,使用邮件营销. 5,创建YouTube视频教程. 6,提交到苹果Web应用门户. 7,提交到其它Web应用门 ...