1、題目描述
給定一個數組X和正整數K,請找出使表達式X[i] - X[i+1] … - X[i + K +1],結果最接近于數組中位數的下標i,如果有多個i滿足條件,請返回最大的i。
其中,數組中位數:長度為N的數組,按照元素的值大小升序排列后,下標為N/2元素的值。
2、輸入描述
第一行輸入一個數組X;
第二行輸入正整數K;
3、輸出描述
數組中位數的下標i。
用例:
輸入
[40,50,15,21,9]
2輸出
3ps:
i為0時,X[0] - X[1] - X[2]- X[3] = 40 - 50 - 15 - 21 = -46;
i=1時,X[1] - X[2]- X[3]- X[4] = 50 - 15 - 21 - 9 = 5;
i=2時,X[2]- X[3] - X[4]= 15 - 21 - 9 = -15;
i=3時,X[3] - X[4]= 21 - 9 = 12;
i=4時,X[4]= 9;
因為中位數是21,最接近它的值是12,故輸出下角標3
溫馨提示!!!
華為OD機試考試官方會對考生代碼查重。華為od機試因為有題庫所以有很大的概率抽到原題。如果碰到了題庫中的原題,千萬不要直接使用題解中的代碼,一定要做些修改,比如代碼中的變量名,除此之外,代碼的組織結構和邏輯也要進行一些改變,所以在日常的刷題中,要提前編寫好屬于自己的代碼。
4、題解
先將數組進行排序找出中位數,根據表達式X[i] - X[i+1] … - X[i + K +1],對數組X進行循環遍歷,計算結果與中位數的距離,獲取結果最接近于數組中位數的下標,如果有多個下標滿足條件,請返回最大的下標。
代碼如下:
public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();int[] x = Arrays.stream(str.substring(1, str.length()-1).split(",")).mapToInt(Integer::parseInt).toArray();int k = Integer.parseInt(sc.nextLine());int[] arr = Arrays.copyOf(x, x.length);Arrays.sort(arr);// 中位數int mid = arr[arr.length / 2];int val = Integer.MAX_VALUE;int index = -1;for (int i=0; i<x.length; i++) {int sum = x[i];for (int j=i+1; j<=i+k && i+k<x.length; j++) {sum -= x[j];}// 求計算結果與中位數的差int abs = Math.abs(mid - sum);// 獲取結果最接近于數組中位數的下標ival = Math.min(abs, val);// 如果有多個i滿足條件,返回最大的if (abs == val) {index = i;}}System.out.println(index);
}
執行結果如下: