checkio-how to find friends

这里写图片描述

寻找朋友。
想法是找到所有和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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值