阿里实习生招聘的编程题

2017年阿里巴巴实习生在线测试编程题:

    对于一个长度为 N 的整型数组A,数组里所有的数都是正整数,对于两个满足0 <= X <= Y < N 的整数,A[X],A[X+1]…A[Y]构成A的一个切片,记作(X,Y)。 用三个下标m1,m2,m3下标满足 0
限制条件:数组A最多有1,000,000项,数组中整数的取值范围介于 -1,000,000到1,000,000之间。

要求:函数计算的复杂度为O(n),使用的额外存储空间(除了输入的数组之外)最多为O(n)。

例子:

对于数组A=[2,5,1,1,1,1,4,1,7,3,7]存在下标2,7,9使得数组分成4个分片[2,5],[1,1,1,4],[7],[7],这3个分片内整数之和相等,所以对于这个数组,函数应该返回true

对于数组A=[10,2,11,13,1,1,1,1,1],找不到能把数组四等分的下标,所以函数应该返回false

Solution

题目要求的时间复杂度是O(n),额外的空间复杂度也是O(n).根据题目的描述,将一个数组四等分的3个切分点是不参与求和的,所以具体四等分结果的累加和我们是一开始无法确定的。但是,当我们确定了第一个切分点的时候,每个等分的累加和就确定了。也正是由于累加和的不确定性,我们无法运用动态规划来设计子问题,不满足后无效性。

由于一开始并不知道每个等分的累加和具体是多少,我们必须假设数组的每一个点都可能成为第一个切分点。这时就需要遍历一边数组,时间复杂度为O(n),确定了累加和之后,要做的事情就是查找了,在后续的数组里查找累加和相等的切片。但是我们需要完成常数复杂度的查找操作,很自然要用到hashmap。设计hashmap的key为累加和,value为数组索引(数组下标0到该索引的所有元素的累加和),额外的空间复杂度为O(n).

这样一来,算法的大致思路就完成了。首先遍历数组,确定第一个切分点以及对应的每等分累加和,然后搜索hashmap在后续的数组中能否查找到相等的累加和切片。

注意:

  • 这个算法只适用于数组元素是正整数的情况,如果有负数的话,累加和会有相同的情况,存入hashmap的时候需要处理冲突。
  • 要写出来bugfree的代码,需要考虑到边界条件,避免数组越界访问的异常。

代码

代码链接

0%