image.png
    image.png

    image.png

    设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。

    现在你想要确认这个 “名人” 是谁,或者确定这里没有 “名人”。而你唯一能做的就是问诸如 “A 你好呀,请问你认不认识 B呀?” 的问题,以确定 A 是否认识 B。你需要在(渐近意义上)尽可能少的问题内来确定这位 “名人” 是谁(或者确定这里没有 “名人”)。

    在本题中,你可以使用辅助函数 bool knows(a, b) 获取到 A 是否认识 B。请你来实现一个函数 int findCelebrity(n)。

    派对最多只会有一个 “名人” 参加。若 “名人” 存在,请返回他/她的编号;若 “名人” 不存在,请返回 -1。

    1. /*
    2. 所有人都认识明星,但是明星不认识所有人,找出谁是明星
    3. */
    4. public class _277_搜寻名人 {
    5. // 提交时不要提交这个函数,只提交下面的方法
    6. public static boolean knows(int x, int i) {
    7. return true;
    8. }
    9. public int findCelebrity(int n) {
    10. int cand = 0;
    11. for (int i = 0; i < n; i++) {
    12. if (knows(cand, i)) {
    13. cand = i;
    14. }
    15. }
    16. // 到这里, cand后面的人不可能是明星,cand不是明星的话就没人是明星了
    17. for (int i = 0; i < cand; i++) {
    18. if (knows(cand, i)) {
    19. return -1;
    20. }
    21. }
    22. for (int i = 0; i < cand; i++) {
    23. if (!knows(i, cand)) {
    24. return -1;
    25. }
    26. }
    27. return cand;
    28. }
    29. }