一、题目描述
给出数字K,请输出所有小于K的整数组合到一起的最小交换次数。
组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。
取值范围:
-100 <= K <= 100
-100 <= 数组中的数值 <= 100
二、输入描述
第一行输入数组:1 3 1 4 0
第二行输入K数值:2
三、输出描述
第一行输出的最少交换次数:1
四、解题思路
利用滑动窗口的思想,窗口大小为所有小于K的整数,然后窗口中大于K的整数是需要替换的次数。
五、解题思路
- 读取输入的整数数组和目标数值K;
- 统计数组中小于K的整数个数,记为count;
- 如果count为1,表示只有一个小于K的整数,不需要交换,直接输出0;
- 初始化最小交换次数minSwapCount为0;
- 遍历数组前count个元素,如果元素大于等于K,将minSwapCount加1;
- 将minSwapCount赋值给临时变量temp;
- 从第count个元素开始遍历数组,记当前元素为nums[j],前一个元素为nums[l],后一个元素为nums[r],其中l = j - count,r = j;
- 如果nums[l]大于等于K且nums[r]小于K,表示交换nums[l]和nums[r]可以减少一次交换次数,将temp减1;
- 如果nums[l]小于K且nums[r]大于等于K,表示交换nums[l]和nums[r]可以增加一次交换次数,将temp加1;
- 更新最小交换次数minSwapCount为min(minSwapCount, temp),保留较小的值;
- 输出最小交换次数minSwapCount;
六、Java算法源码
/**
* 给出数字K,请输出所有小于K的整数组合到一起的最小交换次数。
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int k = sc.nextInt();
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < k) {
count++;
}
}
// 如果只有一个,则不需要交换
if (count == 1) {
System.out.println(0);
return;
}
// 最小交换次数
int minSwapCount = 0;
for (int i = 0; i < count; i++) {
if (nums[i] >= k) {
minSwapCount++;
}
}
int temp = minSwapCount;
for (int j = count; j < nums.length; j++) {
int l = j - count;
int r = j;
if (nums[l] >= k && nums[r] < k) {
temp--;
} else if (nums[l] < k && nums[r] >= k) {
temp++;
}
// 最小交换次数
minSwapCount = Math.min(minSwapCount, temp);
}
System.out.println(minSwapCount);
}
七、效果展示
1、输入
1 3 1 4 0
2
2、输出
1
🏆下一篇:华为OD机试真题 Java 实现【不爱施肥的小布】【2023Q2 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。