华为OD机试 - 根据某条件聚类最少交换次数 - 滑动窗口(Java 2023 B卷 100分)

目录

华为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次

四、解题思路

  1. 确定滑动窗口大小,滑动窗口的大小取决于有多少个数小于k,假定总共有m个数小于k,这个数值即为滑动窗口的长度;
  2. 让滑动窗口从数组起始端向右滑动,每滑动一位,就计算出当前窗口内有多少个数小于k,将这些统计数字做比较,找出最大的,假定窗口内最多有n个数小于k;
  3. m与n的差值就是需要交换的次数。

五、Java算法源码

java 复制代码
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、输入

1 2 3 4 2

3

2、输出

1

3、说明

(1)根据解题思路:

  1. 确定滑动窗口大小,滑动窗口的大小取决于有多少个数小于k,假定总共有m个数小于k,这个数值即为滑动窗口的长度;
  2. 让滑动窗口从数组起始端向右滑动,每滑动一位,就计算出当前窗口内有多少个数小于k,将这些统计数字做比较,找出最大的,假定窗口内最多有n个数小于k;
  3. m与n的差值就是需要交换的次数。

(2)具体解题思路:

  1. 滑动窗口的大小取决于有多少个数小于k --> m = 3;
  2. 滑动窗口大小为3,每三个一滑,计算当前窗口内有多少个数小于k;
    • 1 2 3 --> 2个
    • 2 3 4 --> 1个
    • 3 4 2 --> 1个
  3. 将这些统计数字做比较,找出最大的n=2。
  4. m与n的差值就是需要交换的次数,即1。

🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
隐退山林几秒前
JavaEE:多线程初阶(一)
java·开发语言·jvm
C_心欲无痕4 分钟前
ts - 模板字面量类型与 `keyof` 的魔法组合:`keyof T & `on${string}`使用
linux·运维·开发语言·前端·ubuntu·typescript
最贪吃的虎6 分钟前
Redis其实并不是线程安全的
java·开发语言·数据库·redis·后端·缓存·lua
一勺菠萝丶9 分钟前
Java 后端想学 Vue,又想写浏览器插件?
java·前端·vue.js
乾元9 分钟前
无线定位与链路质量预测——从“知道你在哪”,到“提前知道你会不会掉线”的网络服务化实践
运维·开发语言·人工智能·网络协议·重构·信息与通信
xie_pin_an9 分钟前
C++ 类和对象全解析:从基础语法到高级特性
java·jvm·c++
AC赳赳老秦10 分钟前
Unity游戏开发实战指南:核心逻辑与场景构建详解
开发语言·spring boot·爬虫·搜索引擎·全文检索·lucene·deepseek
无限码力10 分钟前
华为OD技术面真题 - 计算机网络 - 3
计算机网络·华为od·面试·华为od技术面真题·华为od面试八股文·华为od技术面计算机网络相关
Tao____11 分钟前
企业级物联网平台
java·网络·物联网·mqtt·网络协议
山峰哥13 分钟前
数据库工程与SQL调优实战:从原理到案例的深度解析
java·数据库·sql·oracle·性能优化·编辑器