网易有道面试总结
第一次实习生面试给了网易有道,总结一下面试的经验,方便日后回顾。有道的一面和二面主要都是就算法和项目展开,并没有对基础知识进行过多的提问,可以看出在面试官也没有准备的情况下,手写算法一定是面试着重考察的,而算法所占的比重取决于面试官准备的程度。
- 连续最大子数组
- 连续最大子数组,并求得起始位置
- 连续子数组和最小
- 连续子数组求绝对值和最小
- 最大存水量
- 收集雨水
- 直方图中找最大矩形
连续最大子数组
第一题十分简单,求解连续最大子数组,不多说,使用动态规划按照递推公式即可得解。
题目解析:当然这道题也存在着某些细节上的问题,例如对于子数组是否能够为空的问题,当数组全部都是负数的时候,如果数组能够为空,那么连续最大的子数组和为0,如果不能够为空,那么连续最大的子数组的和为最大的那个负数。
在代码中的体现如下:
public static int getMaxSum(int[] a){
int length=a.length;
int max=a[0];//如果可以为空那么这里赋值为0,不能为空赋值为a[0]
int nmax=0;
for(int i=0;i<length;i++){
nmax=Math.max(nmax+a[i], a[i]);
if(nmax>max){
max=nmax;
}
}
return max;
其实动态规划中要做的就是找到能够标示当前i状态的表达式,以及怎么从第i个状态推演出第i+1个状态的表达式。首先第一步,以这个题为例,因为要求连续的最大子数组,那么第i个状态下的最大值不是第i-1个状态下的最大值加上a[i],就是a[i]本身(是a[i]本身意味着之前的累加对a[i]做出了负贡献,需要从a[i]这个位置重新开始),在这个过程中不断的存储最大值。
连续最大子数组起始位置
利用ArrayList存储index,对于第i个状态如果是nmax+a[i]较大,则直接将i put进List,否则将list清除,再将iput进。
public static int[]