华为OD机考算法题:根据某条件聚类最少交换次数

目录

题目部分

解读与思路

代码实现


题目部分

题目根据某条件聚类最少交换次数
题目说明给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。
组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。
数据范围
-100 <=K <= 100
-100 <= 数组中数值 <= 100
输入描述第一行输入数组:1 3 1 4 0
第二行输入K数值:2
输出描述第一行输出最少较好次数:1
补充说明小于2的表达式是 1 1 0,共三种可能将所有符合要求数字组合在一起,最少交换1次。
-----------------------------------------
示例
示例1
输入1 3 1 4 0
2
输出1
说明
示例2
输入0 0 0 1 0
2
输出0
说明
示例3
输入2 3 2
1
输出0
说明


解读与思路

题目解读

第一行输入整形数字 K,第二行输入一串整形数字(假设这一串整形数字存放在一个数组中)。

题目要求,从第二行整形数字中,找出所有小于 K 的数字。然后通过交换位置的方式,使找出的这些数字聚合在一块。

  • 聚合在一块的意思是,这些数字两两相邻,中间不存在不符合条件(大于或等于K)的数字。
  • 交换位置的规则是,数组(根据之前的假设,数字存放在数组中)中的任意两个下标的数字交换都可以交换位置。

在示例 1 中,下标为0的数字 1和下标为3的数字4交换后,数字串变成了 4 3 1 0。此时,从第2个元素到第4个元素,这3个数字全都小于2(K等于2)。再次过程中,交换了1次。

特别注意,在示例 3 中,没有数字小于K,即不存在满足条件的数字时,返回 0。

一个好的题目,题干应该准确描述背景、条件和要求。晦涩难懂或有歧义的题目容易产生误导。示例作用是进一步印证题干的描述,而不应用于补充题目说明。
出题人在描述问题时,部分隐含条件没有描述出来(当找不到满足条件的交换次数时,返回值应该是多少),而且表述不够清晰(应明示交换规则为,任意两个位置的数字可以相互交换),需要结合示例才能准确理解题目意思。

分析与思路

第一行输入的数字设为 k。
第二行输入的一串数字,把它存到一个整形数组 arr[] 中。

先遍历数组 arr,统计 arr 中小于 k 的数字个数 count,并记录这些数字的最小下标 minIdx 和 最大下标 maxIdx。如果 count 为 0,则直接返回 0。

题目要求小于 k 的数字聚合在一起,那么最终聚合的块的数字是连续的,假设聚合块中数字的最小下标为 iMin,最大小标为 iMax,那么 iMax - iMin == count - 1,且下标在iMin与iMax之间的所有数字都小于 k 。

对于原始数组,如果某个小于 k 的数字,其在 arr 中的下标处于闭区间 [iMin, iMax] 中,那么它不需要交换;如果在其之外,需要和其他下标在 [ iMin, iMax ] 中且大于 k 的数字交换。显而易见,交换次数为 [iMin, iMax] 这个闭区间(闭区间为arr数组的下标)中大于 k 的数字的个数。

由于iMin >= minIdx,iMax >= maxIdx,此题的要求可以转换成,从 [minIdx, maxIdx] 这个闭区间中,找出一个长度为 count 的闭区间(闭区间为arr数组的下标),使 arr 数组中大于 k 的数字的个数最小。计算出的最小个数,即为最终的输出。

在此解法中,需要遍历数组两次(第二次只需要遍历 [ minIdx, maxIdx - count ]),其时间复杂度为 o(n)。由于使用了辅助数组用于存储数字,空间复杂度为 o(n)。


代码实现

Java代码

import java.util.Scanner;/*** 根据某条件聚类最少交换次数* @since 2023.09.05* @version 0.1* @author Frank**/
public class TogetherChgCnt {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 第一行输入一串数字,以空格分隔String stream = sc.nextLine();String[] strArr = stream.split(" ");int[] arr = new int[ strArr.length ];for( int i = 0; i < strArr.length; i ++ ){arr[i] = Integer.parseInt( strArr[i] );}// 第二行, kString strK = sc.nextLine();int k = Integer.parseInt( strK );int minIdx = -1;int maxIdx = -1;int count = 0;for( int i = 0; i < arr.length; i ++ ){if( arr[i] >= k ){continue;}count ++;if( minIdx == -1 ) {minIdx = i;maxIdx = i;}else{maxIdx = i;}}if( count == 0 ){System.out.println(0);return;}int curCnt = 0;for( int i = 0; i < count; i ++ ){if( arr[ minIdx + i ] >= k ){curCnt ++;}}int rangeCnt = curCnt;int stepSize = maxIdx - minIdx - count + 1;// 在区间[ minIdx, maxIdx ]范围内,// 逐个向右移动,计算移动后的闭区间中大于 k 的个数 curCnt。for( int i = 0; i < stepSize; i ++ ){if( arr[ minIdx + i ] >= k ){curCnt --;}if(  arr[ minIdx + count + i ] >= k){curCnt ++;}if( curCnt < rangeCnt ){rangeCnt = curCnt;}			}System.out.println( rangeCnt );		}
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {let input = [];while (line = await readline()) {input.push(line);}// 第一行数据转换成数组var arr = input[0].split(" ");for (var i = 0; i < arr.length; i++) {arr[i] = parseInt(arr[i]);}// 第二行数据,kvar k = parseInt(input[1]);var minIdx = -1;var maxIdx = -1;var count = 0;for (var i = 0; i < arr.length; i++) {if (arr[i] >= k) {continue;}count++;if (minIdx == -1) {minIdx = i;maxIdx = i;} else {maxIdx = i;}}if (count == 0) {console.log( 0 );return;}var curCnt = 0;for (var i = 0; i < count; i++) {if (arr[minIdx + i] >= k) {curCnt++;}}var rangeCnt = curCnt;var stepSize = maxIdx - minIdx - count + 1;for (var i = 0; i < stepSize; i++) {if (arr[minIdx + i] >= k) {curCnt--;}if (arr[minIdx + count + i] >= k) {curCnt++;}if (curCnt < rangeCnt) {rangeCnt = curCnt;}}console.log(rangeCnt);
}();

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习模型调参经验

调参经验&#xff1a; 1.Seed在小数据集上有着重要作用&#xff0c;用于参数初始化&#xff0c;可以选取合适的seed。 2.确定epoch&#xff0c;是根据损失函数的值&#xff0c;画出损失函数曲线图&#xff0c;人工确认或者运用早停法。进而再确定auc。 3.batch_size在大数据…

如何将枯燥的大数据进行可视化处理?

在数字时代&#xff0c;大数据已经成为商业、科学、政府和日常生活中不可或缺的一部分。然而&#xff0c;大数据本身往往是枯燥的、难以理解的数字和文字&#xff0c;如果没有有效的方式将其可视化&#xff0c;就会错失其中的宝贵信息。以下是一些方法&#xff0c;可以将枯燥的…

BRAM/URAM资源介绍

BRAM/URAM资源简介 Bram和URAM都是FPGA&#xff08;现场可编程门阵列&#xff09;中的RAM资源。 Bram是Block RAM的缩写&#xff0c;是Xilinx FPGA中常见的RAM资源之一&#xff0c;也是最常用的资源之一。它是一种单独的RAM模块&#xff0c;通常用于存储大量的数据&#xff0…

xctf攻防世界 MISC之CatFlag

0x01.进入环境&#xff0c;下载附件 拿到的是一个无后缀的flag文件&#xff0c;用winhex打开后发现是奇奇怪怪的乱码&#xff0c;用kali的strings搜索也没找到flag情况。 0x02.问题分析 题目提示如图&#xff1a; 让直接cat就行&#xff0c;在kali中直接尝试输入&#xff1a…

Ubuntu22.04 install Kafka

kafka quickstart install kafka

springWeb

springweb就是spring框架中的一个模块&#xff0c;对web层进行了封装&#xff0c;使用起来更加方便。如何方便&#xff1f;参数接收框架进行封装 SpringWeb拥有控制器&#xff0c;接收外部请求&#xff0c;解析参数传给服务层。 SpringWeb运行流程 用户发起请求 ip:端口/项目名…

仿射密码 affine

参考链接&#xff1a;https://www.cnblogs.com/0yst3r-2046/p/12172757.html 仿射加密法 在仿射加密法中&#xff0c;字母表的字母被赋予一个数字&#xff0c;例如 a0&#xff0c;b1&#xff0c;c2…z25 。仿射加密法的密钥为0-25直接的数字对。 仿射加密法与单码加密法没什么…

nginx-QPS限制

漏桶算法&#xff1a; 通过nginx配置实现QPS限速。 #设置请求并发量 qps1&#xff0c;不设置burst&#xff0c;会同时处理并发的请求&#xff0c;但是由于我们只设置了1个qps&#xff0c;所以同一时间内的请求&#xff0c;只有一个是正常的&#xff0c;其他都是失败的。 http配…

GRU门控循环单元

GRU 视频链接 https://www.bilibili.com/video/BV1Pk4y177Xg?p23&spm_id_frompageDriver&vd_source3b42b36e44d271f58e90f86679d77db7Zt—更新门 Rt—重置门 控制保存之前一层信息多&#xff0c;还是保留当前神经元得到的隐藏层的信息多。 Bi-GRU GRU比LSTM参数少 …

升级iOS 17出现白苹果、不断重启等系统问题怎么办?

iOS 17发布后了&#xff0c;很多果粉都迫不及待的将iphone/ipad升级到最新iOS17系统&#xff0c;体验新系统功能。 但部分果粉因硬件、软件的各种情况&#xff0c;导致升级系统后出现故障&#xff0c;比如白苹果、不断重启、卡在系统升级界面等等问题。 如果遇到了这些系统问题…

数学建模--决策树的预测模型的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ 决策树的应用:对泰坦尼克号数据集成员进行预测生死 算法流程还是比较简单的,简单学习一下决策树跟着注释写即可 文章参考:https://zhuanlan.zhihu.com/p/133838427 算法种遇上sklear…

【MQTT接收数据写入数据库】

MQTT接收数据写入数据库 1.搭建MQTT服务器 参考上一篇文章 2.安装数据库mysql sudo apt update sudo apt install mysql-server创建一个数据库和数据表存储mqtt消息 首先&#xff0c;登录到MySQL服务器&#xff1a; mysql -u root -p输入你的root用户密码。默认root 3.创…

sqlserver数据库链接mysql服务器访问数据

sqlserver数据库链接mysql服务器访问数据 关于SqlServer数据库怎么链接mysql数据库我一直不明白&#xff0c;今天项目碰到一个问题需要链接&#xff0c;我就研究了一下&#xff0c;然后就成功了&#xff0c;在这里记录一下。也欢迎朋友互相学习交流借鉴。 1.使用navicat打开S…

ui设计岗位招聘要求有哪些? 优漫动游

UI设计师的工作是接到使用者轮廓、线框草稿后&#xff0c;创造出好看、好用的画面&#xff0c;视情况会搭配VisualDesigner&#xff08;视觉设计师&#xff09;&#xff0c;不过偶尔还是需要自己做图&#xff0c;包含插图、icon绘制等&#xff1b;透过设计过的画面&#xff0c;…

【EI/SCOPUS会议征稿】第二届环境遥感与地理信息技术国际学术会议(ERSGIT 2023)

第二届环境遥感与地理信息技术国际学术会议 2023 2nd International Conference on Environmental Remote Sensing and Geographic Information Technology 第二届环境遥感与地理信息技术国际学术会议&#xff08;ERSGIT 2023&#xff09;定于2023年11月10-12日在中国陕西西安…

Hadoop的第二个核心组件:MapReduce框架第二节

Hadoop的第二个核心组件&#xff1a;MapReduce框架第二节 六、MapReduce的工作流程原理&#xff08;简单版本&#xff09;七、MapReduce中的序列化机制问题八、流量统计案例实现&#xff08;序列化机制的实现&#xff09; 六、MapReduce的工作流程原理&#xff08;简单版本&…

Lua03——开发环境搭建

1 安装开发插件 在 idea 或 vscode 中安装 lua 的开发插件 EmmyLua 2 创建工程 在 idea 中创建一个新的工程 工程的类型选择 lua 输入工程名及目标目录 在工程结构的SDK中设置lua在本地安装目录 在工程结构的modules中选择 lua 3 编写第一个lua程序 在工程下添加程序包&#…

Java 中 List 集合取补集

交集 Intersection 英 [ˌɪntəˈsekʃn] 并集 Union 英 [ˈjuːniən] 差集 difference of set 补集 complement set 英 [ˈkɒmplɪment] Java 中 List 集合取交集 Java 中 List 集合取并集 Java 中 List 集合取差集 Java 中 List 集合取补集 # 求两个集合交集的补集 List&l…

阿里云服务器怎么退款?云服务器退款流程图

阿里云服务器如何退款&#xff1f;云服务器在哪申请退款&#xff1f;在用户中心订单管理中的退订管理中退款&#xff0c;阿里云百科分享阿里云服务器退款流程&#xff0c;包括申请退款入口、云服务器退款限制条件、退款多久到账等详细说明&#xff1a; 目录 阿里云服务器退款…

解决readme.md文件中粘贴的图片放到GitHub上无法显示问题

问题原因 GitHub的README.md文件通常无法直接引用本地文件或图片&#xff0c;因为GitHub的README.md是在远程服务器上渲染和显示的&#xff0c;无法访问本地文件系统。 解决方案 要在GitHub的README.md中显示图片&#xff0c;你需要将图片上传到GitHub上&#xff0c;然后使用图…