华为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、解决思路
- 使用逐对比较的方法,检查每一对端口组之间是否存在两个或以上的相同端口。
- 如果有,则将这两个端口组合并为一个。
- 合并后,重复检查其他端口组,直到不再有新的合并发生。
- 最终,将所有合并后的端口组输出。
3、具体步骤:
- 数据读取:
- 读取 M 个端口组,将每个端口组存储在 List<Set> 中。
- 使用 HashSet 存储每个端口组中的端口,以便后续快速查找交集。
- 合并端口组:
- 遍历所有端口组,检查每对端口组之间是否有两个或以上的相同端口。
- 如果有,则将这两个端口组合并。
- 使用布尔变量 merged 追踪合并状态,重复合并过程,直到无法继续合并为止。
- 输出结果:
- 将合并后的端口组转换成指定格式输出。
六、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在线答疑。