当前位置: 首页 > 面试经验 >

【华为OD机试2023】关联端口组合并(Python)

优质
小牛编辑
138浏览
2023-03-28

【华为OD机试2023】关联端口组合并(Python)

题目描述:

有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超出范围,输出[[]]

解题思路:

①每次遍历后,如果有端口组合并,那么必须重新再开始一轮遍历,来确定是否还需要进行合并,所以在两层的for循环外,还需要再套一层while,并设置变量flag,只要在for循环内,进行过一次合并,flag就置为True,以便开始下一轮while

②去重和端口组内排序,可以使用set()函数,然后用list()重新转化为列表

③合并时,永远是编号靠后的端口组合并入编号靠前的端口组,并弹出靠后的这个端口组。这里比较简单,因为i一定小于j。不过要记住,在合并后需要再进行一次去重和组内排序

④每次发生合并,端口列表st长度会发生变化,需要重新计算,否则会报错(数组下标超出范围)

(试了范例,都过了,但感觉写得还是有点复杂,不知道有没有更简洁易懂的方法,如果有的话,欢迎留言)


n=int(input())
if n<1 or n>10:
print('[[]]')
else:
st = [list(set(map(int, input().split(',')))) for i in range(n)]
flag = True
while flag:
flag=False
for i in range(len(st)):
for j in range(i+1,len(st)):
if len(st[i])>100 or len(st[i])<1 or len(st[j])>100 or len(st[j])<1:
print('[[]]')
break
else:
small=min(st[i],st[j])
big = max(st[i], st[j])
count=0
for word in small:
if word in big:
count+=1
if count>=2:
st[i].extend(st[j])
st[i]=list(set(st[i]))
st.pop(j)
flag=True
break
print(st)

#华为机试,emo了#
 类似资料: