题目
给定一个数组X和正整数K,请找出使表达式X[i]-x[i+1]…-X[i+k-1],结果最接近于数组中位数的下标i,如果有多个满足条件,请返回最大的i。
其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值
补充说明:
1.数组X的元素均为正整数;
2.X的长度n取值范围: 2<= n <= 1000;
3.K大于0且小于数组的大小;
4. i的取值范围:0<=i < 1000;
5.题目的排序数组X[N]的中位数是X[N/2].
示例1
输入:
[50,50,2,3],2
输出:
1
说明:
1、中位数为50:[50,50,2,3]升序排序后变成[2,3,50,50],中位数为下标4/2=2的元素50;
2、计算结果为1:X[50,50,2,3]根据题目计算X[i]-x[i+1]…-X[i+k-1]得出三个数
0 (X[0]-X[1]= 50 -50),
48(X[1]-X[2]= 50 -2),
-1(X[2]-X[3]= 2-3),
其中48最接近50,因此返回下标1
说明
根据题目得知,表达式X[i]-x[i+1]…-X[i+k-1],来计算生成的值,如果X数组有i个值,那么表达式生成的数为i-1个。其实我是有点不清楚题目中i+k-1具体要求。例如:
[20,5,8,4,3,2,5],3
k=3;在下标为0的表达式 值为 X[0]-X[1]-X[i+k-1] 这里i+k-1=2,意味着i+k-1为上限的下标值为2,以此类推,当i=5时,表达式的值为X[5]-X[6]-X[5+3-1]这里i+k-1 = 7,已经超出了X的下标,所以这里上限下标应该是X数组的lenght=7。当然,同时、当i=6的时候X[6]=5,符不符合表达式的要求,在题目给出的例子中,可以看出,它是没有计算i=6时候表达式的值。
所以,给出了几个限制,当i+k-1>X.lenght时就把上限替换为X.lenght。然后,创建一个数组大小为i-1的,来存储表达式的值。
java代码
package odTest;import java.util.Arrays;
import java.util.Scanner;public class calculateNearVal {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);char[] strList = scanner.nextLine().toCharArray();String array = "";int k = 0;for(int i = 0;i<strList.length;i++ ) {if(strList[i]=='[') {continue;}if(strList[i]==']') {k = strList[i+2]-'0';break;}array = array+strList[i];}int[] intArray = Arrays.stream(array.split(",")).mapToInt(Integer::parseInt).toArray();int[] minusArray = new int[intArray.length-1];int topLimit = 0;for(int j=0;j<minusArray.length;j++) {if(j+1 < j+k-1 && j+k-1<=minusArray.length) {topLimit = j+k-1;}else if(j+k-1 > minusArray.length) {topLimit = minusArray.length;}else {topLimit = j+1;}minusArray[j] = intArray[j];for(int n=j+1;n<=topLimit;n++) {minusArray[j] = minusArray[j] - intArray[n];}}Arrays.sort(intArray);int midIndex = intArray.length/2;
// System.out.println(midIndex);int objVal = intArray[midIndex];int objectIndex = 0,minVal = Integer.MAX_VALUE;for(int i=0;i<minusArray.length;i++) {if((objVal-minusArray[i])<=minVal) {minVal = objVal-minusArray[i];objectIndex = i;}}System.out.println(objectIndex);}}