二面中遇到了下面两个编程题
- 走台阶问题(n级台阶,每次只能走1个或者2个台阶–>总共有多少种走法)
- 寻找连续子数组最大和问题
第一题采用递归即可实现,第二题的实现时间复杂度为O(n),具体解法如下:
/**
* 在滴滴软件研发工程师面试过程中遇到的编程题
* Created by liuming on 2017/4/26.
*/
public class 面试编程题_滴滴 {
/*******************************************
* 走台阶问题:n级台阶,每次只能走1个或者2个台阶-->总共有多少种走法
*******************************************/
private static int pathCount = 0;
static void findPath(int n) {
if (n - 1 == 0 || n - 2 == 0) {
pathCount++;
}
if (n - 1 > 0) {
findPath(n - 1);
}
if (n - 2 > 0) {
findPath(n - 2);
}
}
/*******************************************
* 寻找连续子数组最大和问题<br>
* 以索引i结尾的的子数组最大和有两种情况(假设以i结尾的子数组最大和为sum(i)):
* ①若sum(i-1)<0,sum(i-1)+arr[i]<arr[i],最大值为sum(i)=arr[i];
* ②若sum(i-1)>=0,sum(i-1)+arr[i]>=arr{i],最大值为sum(i)=sum(i-1)+arr[i]
*******************************************/
static int findMaxSum(int[] arr) {
int result = arr[0];
int sum = arr[0];
for (int i = 2; i < arr.length; i++) {
if (sum > 0) {
sum += arr[i];
} else {
sum = arr[i];
}
if (result < sum) {
result = sum;
}
}
return result;
}
}