华为OD机试 - 端口合并(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

有M(1<=M<=10)个端口组,每个端口组是长度为N(1<=N<=100)的整数数组,如果某端口组间存在2个及以上不同端口相同,则认为这2个端口组互相关联,可以合并。

第一行输入端口组个数M,再输入M行,每行逗号分隔,代表端口组。

输出合并后的端口组,用二维数组表示。

二、输入描述

第一行输入一个数字M

第二行开始输入M行,每行是长度为N的整数数组,用逗号分割

三、输出描述

合并后的二维数组

四、测试用例

测试用例1:

1、输入

4
4
2,3,2
1,2
5

2、输出

[[4],[2, 3],[1, 2],[5]]

3、说明

仅有一个端口2相同,不可以合并。

测试用例2:

1、输入

3
2,3,1
4,3,2
5

2、输出

[[1,2,3,4],[5]]

3、说明

端口组1 ([2, 3, 1]) 和 端口组2 ([4, 3, 2]) 有两个相同的端口(2 和 3),可以合并为一个新的端口组 [1, 2, 3, 4]。

端口组3 ([5]) 与其他端口组没有两个或以上的相同端口,无法合并。

最终结果是两个合并后的端口组:[[1, 2, 3, 4], [5]]。

测试用例3:

1、输入

6
10
4,2,1
9
3,6,9,2
6,3,4
8

2、输出

[[10],[1,2,3,4,6,9],[9],[8]]

3、说明

通过逐对比较,发现端口组4 [3, 6, 9, 2] 和端口组5 [6, 3, 4] 有两个相同的端口,可以合并为 [2, 3, 4, 6, 9]。

然后端口组2 [4, 2, 1] 与新的合并组 [2, 3, 4, 6, 9] 有三个相同的端口,因此合并为 [1, 2, 3, 4, 6, 9]。

其他端口组 [10]、[9]、[8] 均无法与其他端口组合并。

最终结果是四个端口组:[[10], [1, 2, 3, 4, 6, 9], [9], [8]]。

五、解题思路

1、问题分析

给定 M 个端口组(数组),每个端口组包含 N 个整数(端口)。

如果两个端口组中有两个或更多相同的端口,它们被认为是相关联的,可以合并成一个端口组。

要求输出合并后的端口组,用二维数组表示。

2、解决思路
  1. 使用逐对比较的方法,检查每一对端口组之间是否存在两个或以上的相同端口。
  2. 如果有,则将这两个端口组合并为一个。
  3. 合并后,重复检查其他端口组,直到不再有新的合并发生。
  4. 最终,将所有合并后的端口组输出。

3、具体步骤:

  1. 数据读取:
    • 读取 M 个端口组,将每个端口组存储在 List<Set> 中。
    • 使用 HashSet 存储每个端口组中的端口,以便后续快速查找交集。
  2. 合并端口组:
    • 遍历所有端口组,检查每对端口组之间是否有两个或以上的相同端口。
    • 如果有,则将这两个端口组合并。
    • 使用布尔变量 merged 追踪合并状态,重复合并过程,直到无法继续合并为止。
  3. 输出结果:
    • 将合并后的端口组转换成指定格式输出。

六、Python算法源码

def merge_port_groups(groups):result = [set(group) for group in groups]merged = Truewhile merged:merged = Falsefor i in range(len(result)):for j in range(i + 1, len(result)):# 检查两个组是否有2个及以上相同的端口intersection = result[i].intersection(result[j])if len(intersection) >= 2:# 合并两个组result[i].update(result[j])result.pop(j)merged = Truebreakif merged:breakreturn resultdef format_output(groups):return "[" + ",".join(str(sorted(list(group))) for group in groups) + "]"def main():# 读取端口组数量M = int(input())# 存储所有端口组port_groups = []for _ in range(M):ports = input().split(",")group = set(int(port) for port in ports)port_groups.append(group)# 合并端口组merged_groups = merge_port_groups(port_groups)# 输出结果print(format_output(merged_groups))if __name__ == "__main__":main()

七、JavaScript算法源码

function mergePortGroups(groups) {let result = groups.map(group => new Set(group));let merged;do {merged = false;for (let i = 0; i < result.length; i++) {for (let j = i + 1; j < result.length; j++) {// 检查两个组是否有2个及以上相同的端口let intersection = new Set([...result[i]].filter(x => result[j].has(x)));if (intersection.size >= 2) {// 合并两个组result[i] = new Set([...result[i], ...result[j]]);result.splice(j, 1);merged = true;break;}}if (merged) break;}} while (merged);return result;
}function formatOutput(groups) {return "[" + groups.map(group => `[${[...group].sort((a, b) => a - b).join(",")}]`).join(",") + "]";
}function main() {const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout});let input = [];rl.on('line', (line) => {input.push(line);}).on('close', () => {// 读取端口组数量let M = parseInt(input[0]);// 存储所有端口组let portGroups = [];for (let i = 1; i <= M; i++) {let ports = input[i].split(",");let group = new Set(ports.map(Number));portGroups.push(group);}// 合并端口组let mergedGroups = mergePortGroups(portGroups);// 输出结果console.log(formatOutput(mergedGroups));});
}main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_GROUPS 10
#define MAX_PORTS 100typedef struct {int ports[MAX_PORTS];int size;
} PortGroup;void mergePortGroups(PortGroup groups[], int *size) {int merged;do {merged = 0;for (int i = 0; i < *size; i++) {for (int j = i + 1; j < *size; j++) {// 检查两个组是否有2个及以上相同的端口int common = 0;for (int p1 = 0; p1 < groups[i].size; p1++) {for (int p2 = 0; p2 < groups[j].size; p2++) {if (groups[i].ports[p1] == groups[j].ports[p2]) {common++;if (common >= 2) {// 合并两个组for (int p = 0; p < groups[j].size; p++) {groups[i].ports[groups[i].size++] = groups[j].ports[p];}// 删除第j个组for (int k = j; k < *size - 1; k++) {groups[k] = groups[k + 1];}(*size)--;merged = 1;break;}}}if (merged) break;}if (merged) break;}if (merged) break;}} while (merged);
}void formatOutput(PortGroup groups[], int size) {printf("[");for (int i = 0; i < size; i++) {printf("[");for (int j = 0; j < groups[i].size; j++) {printf("%d", groups[i].ports[j]);if (j < groups[i].size - 1) printf(",");}printf("]");if (i < size - 1) printf(",");}printf("]\n");
}int main() {int M;scanf("%d", &M);PortGroup portGroups[MAX_GROUPS];int size = M;for (int i = 0; i < M; i++) {portGroups[i].size = 0;char line[512];scanf("%s", line);char *token = strtok(line, ",");while (token) {portGroups[i].ports[portGroups[i].size++] = atoi(token);token = strtok(NULL, ",");}}// 合并端口组mergePortGroups(portGroups, &size);// 输出结果formatOutput(portGroups, size);return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <set>
#include <sstream>
#include <string>using namespace std;vector<set<int>> mergePortGroups(vector<set<int>>& groups) {vector<set<int>> result(groups.begin(), groups.end());bool merged;do {merged = false;for (int i = 0; i < result.size(); i++) {for (int j = i + 1; j < result.size(); j++) {// 检查两个组是否有2个及以上相同的端口set<int> intersection;set_intersection(result[i].begin(), result[i].end(), result[j].begin(), result[j].end(),inserter(intersection, intersection.begin()));if (intersection.size() >= 2) {// 合并两个组result[i].insert(result[j].begin(), result[j].end());result.erase(result.begin() + j);merged = true;break;}}if (merged) break;}} while (merged);return result;
}string formatOutput(const vector<set<int>>& groups) {stringstream ss;ss << "[";for (int i = 0; i < groups.size(); i++) {ss << "[";auto it = groups[i].begin();for (; it != groups[i].end(); ++it) {ss << *it;if (next(it) != groups[i].end()) {ss << ",";}}ss << "]";if (i < groups.size() - 1) {ss << ",";}}ss << "]";return ss.str();
}int main() {int M;cin >> M;cin.ignore(); // 消耗换行符// 存储所有端口组vector<set<int>> portGroups;for (int i = 0; i < M; i++) {string line;getline(cin, line);stringstream ss(line);string port;set<int> group;while (getline(ss, port, ',')) {group.insert(stoi(port));}portGroups.push_back(group);}// 合并端口组vector<set<int>> mergedGroups = mergePortGroups(portGroups);// 输出结果cout << formatOutput(mergedGroups) << endl;return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述 线上发现一条类似这样的慢sql&#xff08;查询时长8s&#xff09;&#xff1a; select id,name,(select count(*) from t14 where t14.idt15.id or t14.id2t15.id) as cnt from t15 ; t14的id和id2字段上都有索引&#xff0c;但是因为条件里有or&#xff0c;导致…

电路设计学习(一)

FUSB302BUCX 可编程 USB Type-C 控制器&#xff0c;带 PD&#xff08;默认 SNK&#xff09; FUSB302BUCX 是一款由 ON Semiconductor 生产的 USB Type-C 控制器&#xff0c;用于实现 USB Type-C 和 USB Power Delivery (PD) 协议。它主要负责 USB Type-C 端口的检测、CC 引脚…

GESP C++二级样题卷

一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1.目前主流的计算机储存数据最终都是转换成&#xff08; &#xff09;数据进行储存。 ​ A&#xff0e;二进制 ​ B&#xff0e;十进制 ​ C&#xff0e; 八进制 ​ D&#xff0e;十六进制 2.已知大写字…

结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142176639 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

量化交易backtrader实践(二)_基础加强篇(3)_策略类实践进阶

通过前面几节的实践&#xff0c;我们已经对股票数据的获取&#xff0c;pandasData数据的格式处理&#xff0c;到bactrader的DATAS结构以及里面的data的数据结构&#xff0c;以及在init和next函数中如何读取和计算都有了比较清晰的认知。我们通过一个最简的回测系统&#xff0c;…

C# 结合 Javascript 测试获取天气信息

目录 测试效果 范例运行环境 关键代码 C#获取网页数据 前端代码 JavaScript 实现 总结 测试效果 获取一些简单的天气信息&#xff0c;可以丰富我们的应用系统&#xff0c;比如开发一个小桌面&#xff0c;小组件&#xff0c;增加一些实用性的系统功能&#xff0c;本文将…

neo4j安装为服务+配置环境变量

目录 neo4j安装为服务 windows services 参照JDK&#xff0c;将neo4j加入到环境变量 neo4j安装为服务 windows services 我的上一篇文章详细写明了如何安装启动neo4j《neo4j安装启动教程对应的jdk配置》&#xff0c;文末的启动neo4j是通过cmd命令行访问bin目录&#xff0c;这…

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Java企业面试题2

1.语言的分代&#xff1a; 第1代&#xff1a;机器语言 机器语言是最底层的计算机编程语言&#xff0c;它是由二进制数构成的一系列指令&#xff0c;直接与计算机硬件交互。每个二进制位模式代表一条特定的指令或数据地址。因为它是直接在硬件上执行的&#xff0c;所以运行效率…

诚邀见证2024九章云极DataCanvas算力包产品发布会!

算力&#xff0c;是驱动全球智能化升级的关键力量&#xff0c;也是智算经济腾飞的主要燃料。 在智算经济腾起之际&#xff0c;我们洞察未来:算力不仅是生产力还将作为社会性普惠AI资源。我们思考未来:算力产品和模式需要何种创新才能够加速算力普惠的进程?我们定义未来:用单位…

react学习笔记一:react介绍

将view规划成一个个的组件&#xff0c;是一个响应式的声明式的设计。 虚拟dom&#xff0c;减少dom操作。vue的虚拟dom是在react的基础上拓展来的。 单向数据流&#xff1a;是一种数据流动的模式。数据流的方向是有上到下的&#xff0c;在react中主要是从父组件流向子组件。 …

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【微处理器系统原理与应用设计第十三讲】通用同/异步收发器USART轮询模式应用设计

USART提供两设备之间的串行双工通信&#xff0c;并支持中断和DMA工作。采用轮询、中断和DMA三种方式进行数据收发。 一、功能需求 实现远程串行通信数据的回传确认。微处理器系统构成的测控设备通过USART&#xff08;串口&#xff09;与用户设备&#xff08;上位机&#xff0…

【Python篇】Python 函数综合指南——从基础到高阶

文章目录 Python 函数综合指南1. 函数介绍1.1 什么是函数&#xff1f;1.2 定义函数示例&#xff1a;1.3 调用函数1.4 函数参数1.4.1 必需参数1.4.2 默认参数1.4.3 关键字参数1.4.4 可变长度参数 2. Python 内置函数2.1 字符串处理函数示例&#xff1a; 2.2 数学函数示例&#x…

基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测

介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统。 系统实现了对建筑电、水、热&#xff0c;气等能源、资源消耗情况的实时监测和预警、动态分析和评估&#xff0c;为用户建立了科学、系统的节能分析方法&#xff0c…

如何让大模型更好地进行场景落地?

自ChatGPT模型问世后&#xff0c;在全球范围内掀起了AI新浪潮。 有很多企业和高校也随之开源了一些效果优异的大模型&#xff0c;例如&#xff1a;Qwen系列模型、MiniCPM序列模型、Yi系列模型、ChatGLM系列模型、Llama系列模型、Baichuan系列模型、Deepseek系列模型、Moss模型…

简单题28-找出字符传中第一个匹配项的下标(Java and Python)20240918

问题描述&#xff1a; Java代码&#xff1a; class Solution {public int strStr(String haystack, String needle) {int n1 haystack.length();int n2 needle.length();if (n2 0) {return 0; // 如果 needle 为空字符串&#xff0c;直接返回 0}if (n1 < n2) {return -…

LeetCode[中等] 142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

LeetCode[中等] 438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 思路&#xff1a;滑动窗口 s包含p的异位词 ——> 则…