checkio-how to find friends

来源:互联网 发布:初级程序员考试内容 编辑:程序博客网 时间:2024/05/29 14:10

这里写图片描述

寻找朋友。
想法是找到所有和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搞来搞去就成功了。。。

0 0
原创粉丝点击