(100分)- 端口合并(Java  JS  Python)
(100分)- 端口合并Java JS Python题目描述有M个端口组(1M10)每个端口组是长度为N的整数数组(1N100)如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。输入描述第一行输入端口组个数M再输入M行每行逗号分割代表端口组。备注端口组内数字可以重复。输出描述输出合并后的端口组用二维数组表示。组内相同端口仅保留一个从小到达排序。组外顺序保持输入顺序备注M,N不在限定范围内统一输出一组空数组[[]]用例输入442,3,21,25输出[[4],[2,3],[1,2],[5]]说明仅有一个端口2相同不可以合并。输入32,3,14,3,25输出[[1,2,3,4],[5]]说明无输入6104,2,193,6,9,26,3,48输出[[10],[1,2,3,4,6,9],[9],[8]]说明无输入11输出[[]]说明无题目解析本题有一个疑点如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。关于不同端口的具体含义以您提供的用例为例两个端口组都包含端口3和3这种情况是否可以合并呢23 3 51 3 3假设数组 a [3,3,5]b [1,3,3]其中a[0]与b[1]的值相同a[1]与b[2]的值也相同。这种情况下虽然端口位置不同但数值相同是否可以视为两个不同的端口匹配这个问题会导致两种不同的解题思路若两个端口组能形成两对数值相同的端口匹配即可进行合并必须形成两对数值不同的端口匹配才能进行合并如果能形成2个端口值相同的端口对那么也可以合并JavaScript算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; let m; rl.on(line, (line) { lines.push(line); if (lines.length 1) { m lines[0] - 0; // M,N不在限定范围内统一输出一组空数组[[]] if (m 10 || m 1) { console.log([[]]); lines.length 0; return; } } if (m lines.length m 1) { lines.shift(); const ports lines.map((line) line.split(,).map(Number)); for (let port of ports) { const n port.length; // M,N不在限定范围内统一输出一组空数组[[]] if (n 1 || n 100) { console.log([[]]); lines.length 0; return; } } console.log(getResult(ports)); lines.length 0; } }); // 算法入口 function getResult(ports) { outer: while (true) { // 这里倒序遍历端口组是为了实现组外顺序保持输入顺序 for (let i ports.length - 1; i 0; i--) { for (let j i - 1; j 0; j--) { // 判断两个端口是否可以合并 if (canUnion(ports[i], ports[j])) { // 将后面的端口组并入前面的端口组这样就不会破坏组外顺序 ports[j].push(...ports[i]); ports.splice(i, 1); continue outer; } } } break; } const ans ports.map((port) [...new Set(port)].sort((a, b) a - b)); return JSON.stringify(ans); } // 如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。 // 下面方法实现中对于“不同端口”的理解是端口位置不同端口值可以相同即以不同位置的端口视为不同端口 function canUnion(port1, port2) { port1.sort((a, b) a - b); port2.sort((a, b) a - b); let same 0; let i 0; let j 0; while (i port1.length j port2.length) { if (port1[i] port2[j]) { i; j; if (same 2) return true; } else if (port1[i] port2[j]) { j; } else { i; } } return false; }Java算法源码import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int m Integer.parseInt(sc.nextLine()); // M,N不在限定范围内统一输出一组空数组[[]] if (m 10 || m 1) { System.out.println([[]]); return; } // 这里使用ArrayList接收端口组是为了后面更方便进行端口组之间的合并 ArrayListArrayListInteger ports new ArrayList(); for (int i 0; i m; i) { Integer[] tmp Arrays.stream(sc.nextLine().split(,)).map(Integer::parseInt).toArray(Integer[]::new); // M,N不在限定范围内统一输出一组空数组[[]] int n tmp.length; if (n 1 || n 100) { System.out.println([[]]); return; } ArrayListInteger tmpList new ArrayList(Arrays.asList(tmp)); ports.add(tmpList); } System.out.println(getResult(ports)); } // 算法入口 public static String getResult(ArrayListArrayListInteger ports) { outer: while (true) { // 这里倒序遍历端口组是为了实现组外顺序保持输入顺序 for (int i ports.size() - 1; i 0; i--) { for (int j i - 1; j 0; j--) { // 判断两个端口是否可以合并 if (canUnion(ports.get(i), ports.get(j))) { // 将后面的端口组并入前面的端口组这样就不会破坏组外顺序 ports.get(j).addAll(ports.get(i)); ports.remove(i); continue outer; } } } break; } StringJoiner out new StringJoiner(,, [, ]); for (ArrayListInteger port : ports) { StringJoiner in new StringJoiner(,, [, ]); for (Integer v : new TreeSetInteger(port)) { // 这里使用TreeSet是为了实现组内相同端口仅保留一个从小到达排序。 in.add(v ); } out.add(in.toString()); } return out.toString(); } // 如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。 // 下面方法实现中对于“不同端口”的理解是端口位置不同端口值可以相同即以不同位置的端口视为不同端口 public static boolean canUnion(ArrayListInteger port1, ArrayListInteger port2) { port1.sort((a, b) - a - b); port2.sort((a, b) - a - b); int same 0; int i 0; int j 0; while (i port1.size() j port2.size()) { if (port1.get(i) - port2.get(j) 0) { i; j; if (same 2) return true; } else if (port1.get(i) port2.get(j)) { j; } else { i; } } return false; } }Python算法源码import re # 如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。 # 下面方法实现中对于“不同端口”的理解是端口位置不同端口值可以相同即以不同位置的端口视为不同端口 def canUnion(port1, port2): port1.sort() port2.sort() same 0 i 0 j 0 while i len(port1) and j len(port2): if port1[i] port2[j]: i 1 j 1 same 1 if same 2: return True elif port1[i] port2[j]: j 1 else: i 1 return False # 从头开始尝试合并端口组 def forPorts(ports): # 这里倒序遍历端口组是为了实现组外顺序保持输入顺序 for i in range(len(ports) - 1, -1, -1): for j in range(i - 1, -1, -1): # 判断两个端口是否可以合并 if canUnion(ports[i], ports[j]): # 将后面的端口组并入前面的端口组这样就不会破坏组外顺序 ports[j].extend(ports[i]) ports.pop(i) return True # 继续尝试合并 return False # 合并尝试结束 # 组内相同端口仅保留一个从小到达排序 def distinctAndSort(port): tmp list(set(port)) tmp.sort() return tmp # 算法入口 def getResult(ports): while True: if not forPorts(ports): break # return list(map(distinctAndSort, ports)) # 如果输出内容不去除空格可得83.33%通过率 return re.sub(f\\s, , str(list(map(distinctAndSort, ports)))) # 输入获取 m int(input()) if m 1 or m 10: print([[]]) else: ports [list(map(int, input().split(,))) for _ in range(m)] if len(list(filter(lambda p: len(p) 1 or len(p) 100, ports))) 0: print([[]]) else: print(getResult(ports))只有形成2对端口值不同的端口对那么才可以合并Java算法源码import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int m Integer.parseInt(sc.nextLine()); // M,N不在限定范围内统一输出一组空数组[[]] if (m 10 || m 1) { System.out.println([[]]); return; } // 这里使用ArrayList接收端口组是为了后面更方便进行端口组之间的合并 ArrayListArrayListInteger ports new ArrayList(); for (int i 0; i m; i) { Integer[] tmp Arrays.stream(sc.nextLine().split(,)).map(Integer::parseInt).toArray(Integer[]::new); // M,N不在限定范围内统一输出一组空数组[[]] int n tmp.length; if (n 1 || n 100) { System.out.println([[]]); return; } ArrayListInteger tmpList new ArrayList(Arrays.asList(tmp)); ports.add(tmpList); } System.out.println(getResult(ports)); } // 算法入口 public static String getResult(ArrayListArrayListInteger ports) { outer: while (true) { // 这里倒序遍历端口组是为了实现组外顺序保持输入顺序 for (int i ports.size() - 1; i 0; i--) { for (int j i - 1; j 0; j--) { // 判断两个端口是否可以合并 if (canUnion(ports.get(i), ports.get(j))) { // 将后面的端口组并入前面的端口组这样就不会破坏组外顺序 ports.get(j).addAll(ports.get(i)); ports.remove(i); continue outer; } } } break; } StringJoiner out new StringJoiner(,, [, ]); for (ArrayListInteger port : ports) { StringJoiner in new StringJoiner(,, [, ]); for (Integer v : new TreeSetInteger(port)) { // 这里使用TreeSet是为了实现组内相同端口仅保留一个从小到达排序。 in.add(v ); } out.add(in.toString()); } return out.toString(); } // 如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。 // 下面方法实现中要形成两对“端口值不同的端口对”即 a [1,2,3]b[2,3,4]可以合并但是a [1,3,3]b[3,3,4]不可以合并 public static boolean canUnion(ArrayListInteger port1, ArrayListInteger port2) { HashSetInteger set1 new HashSet(port1); HashSetInteger set2 new HashSet(port2); int same 0; for (Integer v1 : set1) { if (set2.contains(v1)) { if (same 2) return true; } } return false; } }JavaScript算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; let m; rl.on(line, (line) { lines.push(line); if (lines.length 1) { m lines[0] - 0; // M,N不在限定范围内统一输出一组空数组[[]] if (m 10 || m 1) { console.log([[]]); lines.length 0; return; } } if (m lines.length m 1) { lines.shift(); const ports lines.map((line) line.split(,).map(Number)); for (let port of ports) { const n port.length; // M,N不在限定范围内统一输出一组空数组[[]] if (n 1 || n 100) { console.log([[]]); lines.length 0; return; } } console.log(getResult(ports)); lines.length 0; } }); // 算法入口 function getResult(ports) { outer: while (true) { // 这里倒序遍历端口组是为了实现组外顺序保持输入顺序 for (let i ports.length - 1; i 0; i--) { for (let j i - 1; j 0; j--) { // 判断两个端口是否可以合并 if (canUnion(ports[i], ports[j])) { // 将后面的端口组并入前面的端口组这样就不会破坏组外顺序 ports[j].push(...ports[i]); ports.splice(i, 1); continue outer; } } } break; } const ans ports.map((port) [...new Set(port)].sort((a, b) a - b)); return JSON.stringify(ans); } // 如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。 // 下面方法实现中要形成两对“端口值不同的端口对”即 a [1,2,3]b[2,3,4]可以合并但是a [1,3,3]b[3,3,4]不可以合并 function canUnion(port1, port2) { const set1 new Set(port1); const set2 new Set(port2); let same 0; for (let v1 of set1) { if (set2.has(v1)) { if (same 2) return true; } } return false; }Python算法源码import re # 如果端口组间存在2个及以上不同端口相同则认为这2个端口组互相关联可以合并。 # 下面方法实现中要形成两对“端口值不同的端口对”即 a [1,2,3]b[2,3,4]可以合并但是a [1,3,3]b[3,3,4]不可以合并 def canUnion(port1, port2): set1 set(port1) set2 set(port2) same 0 for v in set1: if v in set2: same 1 if same 2: return True return False # 从头开始尝试合并端口组 def forPorts(ports): # 这里倒序遍历端口组是为了实现组外顺序保持输入顺序 for i in range(len(ports) - 1, -1, -1): for j in range(i - 1, -1, -1): # 判断两个端口是否可以合并 if canUnion(ports[i], ports[j]): # 将后面的端口组并入前面的端口组这样就不会破坏组外顺序 ports[j].extend(ports[i]) ports.pop(i) return True # 继续尝试合并 return False # 合并尝试结束 # 组内相同端口仅保留一个从小到达排序 def distinctAndSort(port): tmp list(set(port)) tmp.sort() return tmp # 算法入口 def getResult(ports): while True: if not forPorts(ports): break # return list(map(distinctAndSort, ports)) return re.sub(f\\s, , str(list(map(distinctAndSort, ports)))) # 输入获取 m int(input()) if m 1 or m 10: print([[]]) else: ports [list(map(int, input().split(,))) for _ in range(m)] if len(list(filter(lambda p: len(p) 1 or len(p) 100, ports))) 0: print([[]]) else: print(getResult(ports))

相关新闻

计算机小程序毕设实战-基于springboot+小程序的高校生活互助平台小程序基于SpringBoot的高校报修与互助平台小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机小程序毕设实战-基于springboot+小程序的高校生活互助平台小程序基于SpringBoot的高校报修与互助平台小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 23:39:07 阅读更多 →
《分布式追踪Span-业务标识融合:端到端业务可观测手册》

《分布式追踪Span-业务标识融合:端到端业务可观测手册》

分布式追踪体系的核心价值本应是打通全链路的可观测性,但传统Span数据仅聚焦于技术调用的时序与拓扑维度,缺失业务维度的锚点,导致追踪结果始终停留在技术层面的链路排查,无法与真实业务场景形成联动,这成为了可观测体…

2026/7/4 22:38:13 阅读更多 →
Python快速入门——学习笔记(持续更新中~)

Python快速入门——学习笔记(持续更新中~)

Python 软件安装 & 环境配置 基础阶段创建文件打印输出变量赋值数学计算结语 软件安装 & 环境配置 首先要想在电脑上运行python文件 就需要两个东西 一个是解释器 一个是编辑器 二者缺一不可 解释器直接用官方的就行 编辑器我推荐pycharm 当然也可以用vscode等等 安…

2026/7/5 19:29:16 阅读更多 →

最新新闻

Monorepo 工程化实战:Turborepo + pnpm 的全栈项目组织与构建缓存

Monorepo 工程化实战:Turborepo + pnpm 的全栈项目组织与构建缓存

Monorepo 工程化实战:Turborepo pnpm 的全栈项目组织与构建缓存 一、多仓库协作的效率黑洞:当你维护 5 个 npm 包时,改一行代码要跑几个 CI 全栈项目的常见组织方式是:前端一个仓库,后端一个仓库,共享类型…

2026/7/7 0:25:32 阅读更多 →
MediaCrawler:5分钟上手,一站式采集小红书、抖音、B站等主流平台数据

MediaCrawler:5分钟上手,一站式采集小红书、抖音、B站等主流平台数据

MediaCrawler:5分钟上手,一站式采集小红书、抖音、B站等主流平台数据 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new 你是否在为新媒体数据分析而烦恼?想要批量获取小红书、…

2026/7/7 0:23:31 阅读更多 →
免疫平衡的“黄金四象限“:IFN-γ/IL-17/IL-4/TGF-β1 Panel构建Th检测体系

免疫平衡的“黄金四象限“:IFN-γ/IL-17/IL-4/TGF-β1 Panel构建Th检测体系

【行业观察 | 生物标志物高通量检测新进展】Adaptive immunity is a balancing act. 这句话在教科书里躺了几十年,但直到今天,大多数实验室仍然在用"单点测量"的方式去逼近这个动态平衡。测了IFN-γ,不知道IL-4的走向;定…

2026/7/7 0:21:30 阅读更多 →
YOLOv8船舶检测实战:从算法原理到海事场景部署

YOLOv8船舶检测实战:从算法原理到海事场景部署

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在船舶运输、港口管理和海事安全领域,如何高效、准确地识别和分类航道中的各类船舶,一直是行业智能化升级的核…

2026/7/7 0:21:30 阅读更多 →
132.带限位报警与急停联锁的智能分拣流水线 PLC 设计

132.带限位报警与急停联锁的智能分拣流水线 PLC 设计

摘要 本文围绕可编程逻辑控制器(PLC)的工程化应用,从底层扫描机制出发,系统讲解PLC的核心原理、梯形图与结构化文本的编程范式,并给出一个完整的物料分拣控制系统实战案例。文章包含可直接运行的CODESYS代码(IEC 61131-3标准),详细说明运行逻辑与调试方法,同时梳理初…

2026/7/7 0:15:25 阅读更多 →
移动应用安全测试终极指南:如何用MobSF框架快速发现应用漏洞

移动应用安全测试终极指南:如何用MobSF框架快速发现应用漏洞

移动应用安全测试终极指南:如何用MobSF框架快速发现应用漏洞 【免费下载链接】Mobile-Security-Framework-MobSF Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and sec…

2026/7/7 0:15:25 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻