华为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在线答疑。

相关推荐
期待のcode1 小时前
Spring框架1—Spring的IOC核心技术1
java·后端·spring·架构
葵野寺1 小时前
【RelayMQ】基于 Java 实现轻量级消息队列(七)
java·开发语言·网络·rabbitmq·java-rabbitmq
书院门前细致的苹果2 小时前
JVM 全面详解:深入理解 Java 的核心运行机制
java·jvm
上官浩仁2 小时前
springboot excel 表格入门与实战
java·spring boot·excel
zyx没烦恼2 小时前
Qt 基础编程核心知识点全解析:含 Hello World 实现、对象树、坐标系及开发工具使用
开发语言·qt
木心爱编程2 小时前
C++链表实战:STL与手动实现详解
开发语言·c++·链表
mkhase2 小时前
9.11-QT-QT的基本使用
开发语言·qt
Kyln.Wu3 小时前
【python实用小脚本-211】[硬件互联] 桌面壁纸×Python梦幻联动|用10行代码实现“开机盲盒”自动化改造实录(建议收藏)
开发语言·python·自动化
Hello.Reader3 小时前
从零到一上手 Protocol Buffers用 C# 打造可演进的通讯录
java·linux·c#
树码小子3 小时前
Java网络初识(4):网络数据通信的基本流程 -- 封装
java·网络