华为OD机试真题 Java 实现【计算最接近的数】【2023 B卷 100分】,附详细解题思路-LMLPHP

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

  • 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。

华为OD机试真题 Java 实现【计算最接近的数】【2023 B卷 100分】,附详细解题思路-LMLPHP

一、题目描述

给定一个数组X和正整数K,请找出使表达式X[i] - X[i+1] ... - X[i + K +1],结果最接近于数组中位数的下标i,如果有多个i满足条件,请返回最大的i。

其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。

二、输入描述

第一行输入一个数组X;
第二行输入正整数K;

三、输出描述

数组中位数的下标i。

四、解题思路

因为数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。

  1. 比如输入[40,50,15,21,9],升序排序后变为[9,15,21,40,50];
  2. 中位数为长度为5的数组/2=2的元素21;

给定一个数组X和正整数K,请找出使表达式X[i] - X[i+1] ... - X[i + K +1],结果最接近于数组中位数的下标i,如果有多个i满足条件,请返回最大的i。

[40,50,15,21,9]
K=2

  1. i为0时,X[0] - X[1] - X[2]- X[3] = 40 - 50 - 15 - 21 = -46;
  2. i=1时,X[1] - X[2]- X[3]- X[4] = 50 - 15 - 21 - 9 = 5;
  3. i=2时,X[2]- X[3] - X[4]= 15 - 21 - 9 = -15;
  4. i=3时,X[3] - X[4]= 21 - 9 = 12;
  5. i=4时,X[4]= 9;

因为中位数是21,最接近它的值是12,故输出下角标3。

五、具体解题步骤

  1. 给定一个数组X,空格分隔;
  2. 输入正整数K;
  3. 求出中位数mid;
    • 按照元素的值大小升序排列;
    • 数组中位数 = 下标为N/2元素的值;
  4. 定义变量index,存储数组中位数的下标i;
  5. 根据表达式X[i] - X[i+1] ... - X[i + K +1],对数组X进行循环遍历;
  6. 求计算结果与中位数的距离;
  7. 获取结果最接近于数组中位数的下标i;
  8. 如果有多个i满足条件,请返回最大的i;
  9. 输出数组中位数的下标i;

六、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // 给定一个数组X
    String arr = sc.nextLine();
    int[] X = Arrays.stream(arr.substring(1,arr.length()-1).split(",")).mapToInt(Integer::parseInt).toArray();
    // 输入正整数K
    int K = Integer.valueOf(sc.nextLine());

    // 因为数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。
    // 1. 按照元素的值大小升序排列
    int[] sortArr = Arrays.stream(X).sorted().toArray();
    // 2. 数组中位数
    int mid = sortArr[X.length / 2];

    int min = Integer.MAX_VALUE;
    // 数组中位数的下标i
    int index = -1;
    for (int i = 0; i <= X.length - K; i++) {
        // X[i] - X[i+1] ... - X[i + K +1]
        int count = X[i];
        for (int j = i + 1; j < i + K; j++) {
            count -= X[j];
        }
        // 求计算结果与中位数的距离
        int abs = Math.abs(count - mid);
        // 获取结果最接近于数组中位数的下标i
        min = Math.min(min, abs);
        // 如果有多个i满足条件,请返回最大的i
        if (min == abs) {
            index = i;
        }
    }

    System.out.println(index);
}

七、效果展示

1、输入

[40,50,15,21,9]
2

2、输出

3

3、说明

因为数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。

  1. 比如输入[40,50,15,21,9],升序排序后变为[9,15,21,40,50];
  2. 中位数为长度为5的数组/2=2的元素21;

给定一个数组X和正整数K,请找出使表达式X[i] - X[i+1] ... - X[i + K +1],结果最接近于数组中位数的下标i,如果有多个i满足条件,请返回最大的i。

[40,50,15,21,9]
K=2

  1. i为0时,X[0] - X[1] - X[2]- X[3] = 40 - 50 - 15 - 21 = -46;
  2. i=1时,X[1] - X[2]- X[3]- X[4] = 50 - 15 - 21 - 9 = 5;
  3. i=2时,X[2]- X[3] - X[4]= 15 - 21 - 9 = -15;
  4. i=3时,X[3] - X[4]= 21 - 9 = 12;
  5. i=4时,X[4]= 9;

因为中位数是21,最接近它的值是12,故输出下角标3。

华为OD机试真题 Java 实现【计算最接近的数】【2023 B卷 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Java 实现【计算最接近的数】【2023 B卷 100分】,附详细解题思路-LMLPHP

07-19 13:52