checkio-how to find friends

checkio-how to find friends_第1张图片

寻找朋友。
想法是找到所有和first有关系的朋友(包括1跳关系及多跳关系)。问题是怎么找多跳关系的朋友加到列表里面。看别人的代码,解释。。。
第一个,by***StefanPochmann***

def check_connection(network, first, second):
    team = {first}
    for _ in network:
        for edge in network:
            pair = set(edge.split('-'))
            if pair & team:
                team |= pair
    return second in team

精简至极。team保存所有和first有关系的朋友。大循环第一次遍历,找出所有和first有1跳关系的朋友放在team中。 这时team中是first加上所有1跳的朋友。大循环第二次循环,重新遍历所有network中朋友对,如果某对朋友对和team中德元素有交集,就将该对朋友和team求并。得到所有和first以及first的1跳朋友的集合的1跳朋友集合,即所有first2跳以内朋友。以此类推。最坏情况是一条直线的关系,所以大循环必要。很黄很暴力,越往后循环每次做的无用计算就越多。

by github jingyuan4ever

def check_connection(network, first, second):
    d = dict()
    for i in network:
        p1, p2 = i.split('-')
        d.setdefault(p1, []).append(p2)
        d.setdefault(p2, []).append(p1)
    opn = [first]
    cls = []
    while len(opn):
        now = opn.pop()
        cls.append(now)
        if now == second:
            return True
        for next in d.setdefault(now, []):
            if next not in cls and next not in opn:
                opn.append(next)
    return False

用到了字典中的setdefault函数,每一个人对应一个key,value中存的是1跳关系的朋友。自己演绎了一下发现正确,个中道理还不是很懂。。自己写怎么想到用cls和opn两个list搞来搞去就成功了。。。

你可能感兴趣的:(checkio-how to find friends)