华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。
给定一个数组X和正整数K,请找出使表达式X[i] - X[i+1] ... - X[i + K +1]
,结果最接近于数组中位数的下标i,如果有多个i满足条件,请返回最大的i。
其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。
第一行输入一个数组X;
第二行输入正整数K;
数组中位数的下标i。
因为数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。
给定一个数组X和正整数K,请找出使表达式X[i] - X[i+1] ... - X[i + K +1]
,结果最接近于数组中位数的下标i,如果有多个i满足条件,请返回最大的i。
[40,50,15,21,9]
K=2
因为中位数是21,最接近它的值是12,故输出下角标3。
X[i] - X[i+1] ... - X[i + K +1]
,对数组X进行循环遍历;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);
}
[40,50,15,21,9]
2
3
因为数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为N/2元素的值。
给定一个数组X和正整数K,请找出使表达式X[i] - X[i+1] ... - X[i + K +1]
,结果最接近于数组中位数的下标i,如果有多个i满足条件,请返回最大的i。
[40,50,15,21,9]
K=2
因为中位数是21,最接近它的值是12,故输出下角标3。
下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。