华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。
组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。
数据范围
-100 <=K <= 100
-100 <= 数组中数值 <= 100
第一行输入数组:1 3 1 4 0
第二行输入K数值:2
第一行输出最少较好次数:1
备注:
小于2的表达式是 1 1 0,共三种可能将所有符合要求数字组合在一起,最少交换1次
package com.guor.od;
import java.util.*;
public class OdTest02 {
/**
* 给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int K = sc.nextInt();
// 遍历数组,找出数组里面有多少个数字小于K,确定滑动窗口大小
int target = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < K) {
target++;
}
}
// 滑动窗口左起点
int left = 0;
// 滑动窗口右终点
int right = target - 1;
// 记录当前窗口范围内有多少个数字小于K
int okSum = 0;
// 再遍历一次,确定初始窗口内有多少个数小于K
for (int i = 0; i <= right; i++) {
if (arr[i] < K) {
okSum++;
}
}
// max用来记录窗口内最多有多少个数小于K
int max = okSum;
// 窗口不停的向右滑动
while (right < arr.length - 1) {
// 左边滑出
if (arr[left++] < K) {
okSum--;
}
// 右边滑入
if (arr[++right] < K) {
okSum++;
}
if (okSum > max) {
max = okSum;
}
}
System.out.println(target - max);
}
}
1 2 3 4 2
3
1
(1)根据解题思路:
(2)具体解题思路:
下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。