题目描述:
有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长度会发生变化,需要重新计算,否则会报错(数组下标超出范围)
(试了范例,都过了,但感觉写得还是有点复杂,不知道有没有更简洁易懂的方法,如果有的话,欢迎留言)
#华为机试,emo了#
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)