今日头条2017校园招聘 技术综合笔试题
描述:按数组的形式给出函数f(x)的取值,即数组A的A[0]元素为f(0)的取值,数组的取值都为整数,函数在每个点都是严格单调递增或者严格单调递减(即A[i-1] != A[i] != A[i+1]),要求找出最宽的先上升后下降的区间(这个区间内函数的值必须先上升到一个点然后下降,区间的上升和下降的长度必须大于0)
1、如果找到符合条件的最大区间输出相应的左右下标(有多个最大区间时,输出最左边的那个)
2、占不到那么输出-1
输入:
n
n长度的整数数组
输出:
区间的范围
样例输入:
10
1 3 1 2 5 4 3 1 9 10
样例输出:
2 7
思路:
先找到函数的各个阶段的最高点,然后依次寻找最高点左边的最低点theMin,最高点右边的最低点theSecondMin,然后比较各个最高点左右最低点的距离width,找到最大的width,输出两边的下标
代码:
import java.util.Scanner;
public class FunctionMaxWidth {
public static void findMaxWidth(int[] A){
int theMin = 0;
int theSecondMin = 0;
int width = 0;
int[] result = {-1,-1};
for (int i = 1; i < A.length-1; i++) {
if(A[i-1] < A[i] && A[i] > A[i+1]){
theSecondMin = i+1;
theMin = i-1;
while(theMin > 0){
if(A[theMin-1] < A[theMin])
theMin--;
else
break;
}
while(theSecondMin < A.length-1){
if(A[theSecondMin] > A[theSecondMin+1])
theSecondMin++;
else
break;
}
if(theSecondMin - theMin > width){
width = theSecondMin - theMin;
result[0] = theMin;
result[1] = theSecondMin;
}
}
}
System.out.println(result[0]+" "+result[1]);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
Scanner scanner2 = new Scanner(System.in);
String[] str = scanner2.nextLine().split(" ");
int[] A = new int[n];
for (int i = 0; i < n; i++) {
A[i] = Integer.valueOf(str[i]);
}
findMaxWidth(A);
}
}