2023华为OD机试真题-关联端口组合并(JAVA、Python、C++)

题目描述:
有M(1<=M<=10)个端口组,每个端口组是长度为N(1<=N<=100)的整数数组,如果端口组间存在2个及以上不同端口相同,则认为这两个端口组互相关联,可以合并。
第一行输入端口组个数M,再输入M行,每行逗号分隔,代表端口组,输出合并后的端口组用二维数组表示

输入描述:
端口组内数字可以重复
输出描述:
1.组内相同端口仅保留一个,从小到大排序。
2.组外顺序保持输入顺序
补充说明:
M,N不再限定范围内,统一输出一组空数组[[]]
 收起
示例1
输入:
4
4
2,3,2
1,2
5
输出:
[[4],[2,3],[1,2],[5]]
说明:
仅有一个端口2相同,不可以合并
示例2
输入:
3
2,3,1
4,3,2
5
输出:
[[1,2,3,4],[5]]
说明:
存在两个2,3有交集,可以合并
示例3
输入:
6
10
4,2,1
9
3,6,9,2
6,3,4
8
输出:
[[10],[1,2,3,4,6,9],[9],[8]]
说明:
示例4
输入:
11
输出:
[[]]
说明:
11超出范围,输出[[]]
 

import sys
m = int(input())
if m < 1 or m > 10: print([[]])
else:
    ports = []
    res = []
    for _ in range(m):
        line = sys.stdin.readline().strip()
        group = set(map(int,line.split(',')))
        ports.append(group)
    res = []
    visited = [0] * m
    for i in range(len(ports)):
        if visited[i] == 1:continue
        if len(ports[i]) < 2:
            res.append(list(ports[i]))
            continue
        temp = ports[i]
        for j in range(i + 1,len(ports)):
            if len(temp & ports[j]) >= 2:
                temp |= ports[j]
                visited[j] = 1
        flag = 0
        for k in range(len(res)):
            x = res[k]
            if len(temp & set(x)) >= 2:
                temp |= set(x)
                list_temp = list(temp)
                list_temp.sort()
                res[k] = list_temp
                flag= 1
        if not flag:
            list_temp = list(temp)
            list_temp.sort()
            res.append(list_temp)
    res_s = '['
    for x in res:
        res_s += '['
        for y in x:
            res_s += str(y) + ','
        res_s = res_s[:-1]
        res_s += '],'
    res_s = res_s[:-1] + ']'
    print(res_s)

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值