> 文档中心 > Python每日一练-----找到小镇的法官(有向图)

Python每日一练-----找到小镇的法官(有向图)

(day11)

目录

🖍题目:

题目分析:

解题思路:

代码实现

代码注释


🖍题目:

小镇里有 n 个人,按从 1n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官👨‍⚖️。

如果小镇法官真的存在,那么:

  1. 小镇法官不会信任任何人。
  2. 每个人(除了小镇法官)都信任这位小镇法官。
  3. 只有一个人同时满足属性 1 和属性 2 。

给你一个数组 trusttrust 中的所有trust[i] = [ai, bi] 互不相同,trust[i].length ==2 ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。

如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。

🌠示例 1:

输入:n = 2, trust = [[1,2]]

序号为1的人信任序号为2的人

解释:所人都信任2

输出:2

🌠示例 2: 

输入:n = 3, trust = [[1,3],[2,3]]

1信任3,2信任3

解释:所有人都信任3

输出:

🌠示例 3: 

输入:n = 3, trust = [[1,3],[2,3],[3,1]]

1信任3,2信任3,3信任1

解释:没有人获得所有人的信任

输出:-1 

题目分析:

所法官就是获得所有人的信任,而他不信任其他人的人。

解题思路:

这道题比较适合使用有向图解题。什么是有向图?

先来简单了解有向图

这是有向图的一种简单形式 。

在有向图中,一个节点(a,b,c,d)的入度是指向该节点的边的数量;而一个节点的出度是从该节点出发的边的数量。

a的出度为3,入度为0

c入度为1,出度为2

现在将箭头看作信任。如a----->b,说明a信任b。

由题目可知

有法官时

 法官获得全部的信任

无法官时

 没人活得全部的信任

我们可以遍历每个节点的入度和出度,如果找到一个符合条件的节点,因为只有一个法官,我们可以直接返回结果;如果不存在符合条件的点,则返回 -1。

因为有n个人,法官获得除他外所有人的信任,所以法官的有n-1个指向他的箭头,即法官的出度为n-1

1.可以创建两个标识into表示入度, out出度

2.接着统计是否有人存在出度为n-1

3.如果有,则为法官如果没有返回-1

代码实现

from collections import Counterdef findJudge(n, trust): into = Counter(y for _, y in trust) out = Counter(x for x, _ in trust) return next((i for i in range(1, n + 1) if into[i] == n - 1 and out[i] == 0), -1)

代码注释

y for _, y in trust

遍历并提取trust[i][1]”_“处可填入任意变量

例:

trust = [[1,3],[2,3], [3,1]]for i, j in trust:    print(i, j)s

输出:

1 3
2 3
3 1
 

Counter()函数

用于计算各元素出现的次数

例:list = [a, b, c, a, c,]

输出:Counter({a:2,   b:1,c:2 })

next函数

语法next(iterator, [default])

iterator为迭代器,default为默认返回值

例:

pop = (i for i in range(2))print(next(pop, -1))print(next(pop, -1))print(next(pop, -1))s

输出:

0
1
-1
每次调用next()只输出一个值,当遍历完后再调用则会输出默认值

完成。

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄