[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,也从他们的面试笔试中看到了自己的一些不足,于是就想写出来和大家分享一下, ...
随机推荐
- solr单机部署tomcat
所需软件:solr4.8.1.Tomcat7 下载完相应软件后开始单机部署(windows下) 在F盘根目录创建solr文件夹,并解压solr4.8和tomcat7到该文件夹 在F盘根目录创建solr ...
- zabbix yum安装
1. 安装zabbix yum源 rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/6/x86_64/zabbix-release-4.0-1.el6. ...
- linux有名管道fifo,进程间通信
命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通 ...
- 一文揭秘定时任务调度框架quartz
之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源 ...
- Vuejs的指令及组件用法总结
vuejs介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能 ...
- netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)
接口定义 io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel ...
- MySQL基准测试(二)--方法
MySQL基准测试(二)--方法 目的: 方法不是越高级越好.而应该善于做减法.至简是一种智慧,首先要做的是收集MySQL的各状态数据.收集到了,不管各个时间段出现的问题,至少你手上有第一时间的状态数 ...
- .15-浅析webpack源码之WebpackOptionsApply模块-plugin事件流总览
总体过了一下后面的流程,发现Compiler模块确实不适合单独讲解,这里继续讲解后面的代码: compiler.options = new WebpackOptionsApply().process( ...
- 【操作系统】二、JVM线程与Linux内核线程的映射
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- 使用git push命令如何忽略不想提交的文件夹或者文件
如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...