做一道很简单的马公面试题吧

g
gokgs
楼主 (北美华人网)
基本可以绊倒 至少 1/3 马公。
一屋子人在聚会, 有一个名人, 人人都认识他, 他不认识任何人, 别人之间可能认识也可能不认识, 假设会通过一个函数告诉你。 怎么把这个名人高效的找出来?
哈哈.
C
ChristinaW
O(log n)
p
pxqteam
哈哈哈哈
东方猪猪
一个人感染了nu病毒, 第二天收到N份nu病毒的就是名人, 如果没有这样的人, 第一个人就是名人. O(1) 😂
g
gokgs
O(log n)
ChristinaW 发表于 2021-11-26 10:35

抓住一个伪码工。
d
dngdnhxqs
我觉得奥数厉害的人,是不是都适合刷题,这就是奥数题啊。
g
gokgs
我觉得奥数厉害的人,是不是都适合刷题,这就是奥数题啊。
dngdnhxqs 发表于 2021-11-26 15:24

奥数比这题要难一百倍至少。这个太简单了。
3
3906
基本可以绊倒 至少 1/3 马公。
一屋子人在聚会, 有一个名人, 人人都认识他, 他不认识任何人, 别人之间可能认识也可能不认识, 假设会通过一个函数告诉你。 怎么把这个名人高效的找出来?
哈哈.
gokgs 发表于 2021-11-26 10:20

1.对于每个 i 属于 1...(n-1) , 2. j 属于 I +1...,n If j 认识 i Remove j Break 循环 2 否则 Remove i Break循环 1
最后剩的就是要的人
不会编程序。但是中层管理也需要知道一点半点,免得被马工们忽悠






试试看
抓住一个伪码工。
gokgs 发表于 2021-11-26 14:05

O(1)?
h
huawei6g
既然人人都认识,任意问一个人,就知道了。
东方猪猪
Boss说, 找个人把这题做了, O(0).
试试看
既然人人都认识,任意问一个人,就知道了。
huawei6g 发表于 2021-11-26 15:47

👍
d
dngdnhxqs
回复 7楼gokgs的帖子
我记得小学奥数就是这个款,你说什么阶段的奥数比这个难多了?
h
huawei6g
space complexity. and time complexity.
试试看 发表于 2021-11-26 15:49

我看不懂那个题说啥,什么叫通过一个函数告诉你。可能是翻译辞不达意?建议楼主把原题完整贴出来吧
V
Vicky710
O(n)吧
果子果子
当数学题做就是O(logn),当coding题做就是O(1)
东方猪猪
假设函数是给出一个人认识的所有人.
随便找个人开始, 每个已被找到过的人设个被找到过的标记. 根据函数提供的那个人认识的所有人里, 找到第一个还没被找到过的人. 继续循环找下一个人.
最后那个没有认识任何人的就是名人. O(N^2) with O(N) space.
老板, 可以给offer吗?

t
teabucket
雪雨星风
假设函数是给出一个人认识的所有人.
随便找个人开始, 每个已被找到过的人设个被找到过的标记. 根据函数提供的那个人认识的所有人里, 找到第一个还没被找到过的人. 继续循环找下一个人.
最后那个没有认识任何人的就是名人. O(N^2) with O(N) space.
老板, 可以给offer吗?


东方猪猪 发表于 2021-11-26 16:32

Strong no hire
东方猪猪
Strong no hire
雪雨星风 发表于 2021-11-26 16:42

😭
s
shirleylim1014
假设函数 f(a,b) = 1 代表a认识b, f(a,b) = 0代表a不认识b
每次任选两个a,b, 如果 f(a,b) = 1 那么 a 不是名人 (名人不认识所有人) f(a,b) = 0 那么 b 不是名人 (所有人都认识名人) 所以每次调动函数都可以排除一个人。调动n-1次后就剩名人了
l
leselaji
O(log n)
ChristinaW 发表于 2021-11-26 10:35

无论如何你都要遍历完所有人,怎么可能log?
3
3906
假设函数 f(a,b) = 1 代表a认识b, f(a,b) = 0代表a不认识b
每次任选两个a,b, 如果 f(a,b) = 1 那么 a 不是名人 (名人不认识所有人) f(a,b) = 0 那么 b 不是名人 (所有人都认识名人) 所以每次调动函数都可以排除一个人。调动n-1次后就剩名人了
shirleylim1014 发表于 2021-11-26 17:06

这个答案是错的。因为没有prioritize a在f(a,b) = 0的情况。每次出现f(a,b) = 0都应该继续以f(a,x)查找
反之对 f(a,b)= 1 也应该prioritize b
l
leselaji
基本可以绊倒 至少 1/3 马公。
一屋子人在聚会, 有一个名人, 人人都认识他, 他不认识任何人, 别人之间可能认识也可能不认识, 假设会通过一个函数告诉你。 怎么把这个名人高效的找出来?
哈哈.
gokgs 发表于 2021-11-26 10:20

每次取一对人, 1.互相认识,全丢掉 2.互相不认识,全丢掉 3.单向认识,留下一个 重复直到剩下一个 每次loop会筛掉至少一半的人,最坏情况每次筛掉一个,所以线性时间
B
Banana.Republic
这个答案是错的。因为没有prioritize a在f(a,b) = 0的情况。每次出现f(a,b) = 0都应该继续以f(a,x)查找
反之对 f(a,b)= 1 也应该prioritize b
3906 发表于 2021-11-26 17:12

没觉得这个答案有什么问题。出现f(a,b)=0没有任何理由prioritize f(a,x),因为剩下的candidate里面机会均等,查f(c,d)甚至f(e,f)也没问题。
3
3906
没觉得这个答案有什么问题。出现f(a,b)=0没有任何理由prioritize f(a,x),因为剩下的candidate里面机会均等,查f(c,d)甚至f(e,f)也没问题。
Banana.Republic 发表于 2021-11-26 17:17

剩下candidate机会并不均等,posterior变了
s
skykitty
LC 那道celebrity 2pass O(n)
s
shirleylim1014
回复 23楼3906的帖子
拜托这个不是面试 我只想写个大家看得懂的答案
想要贡献的话就写个optimized solution 我继续黑五刷刷刷去了
f
facet
基本可以绊倒 至少 1/3 马公。
一屋子人在聚会, 有一个名人, 人人都认识他, 他不认识任何人, 别人之间可能认识也可能不认识, 假设会通过一个函数告诉你。 怎么把这个名人高效的找出来?
哈哈.
gokgs 发表于 2021-11-26 10:20

O(1) 人人都认识的意思就啊哈,随便找个人问一下,“你是不是名人?如果不是那谁是?”不就行了?
J
Jingjing5
假设是n个人,分别编号是1,2.。。。n
从里面任选2个人出来, 看他们互相认识不认识,有4种可能情况,第一种情况,if 两个人都互相认识,则两个人都去掉,都不会是领导, 第二种情况,if 两个人都不互相认识,则两个人也不可能是领导,则两个人也都去掉, 第三种情况,如果a认识b,b不认识a,则a不可能是领导,b可能是领导,则a去掉,b留着,,第四种情况,跟第三种情况相反,则a留着,b去掉, 这时就只剩下n-1个人或者n-2个人,一个循环结束了,
接着又进行第二个循环。
直到最后一个循环,只剩下两个人了,x和y,如果x认识y,则y是领导,如果y认识x,则x是领导。
B
Banana.Republic
剩下candidate机会并不均等,posterior变了
3906 发表于 2021-11-26 17:19

有道理,但之前答案也不能说是错的吧,时间复杂度不变,只是少点optimization
果子果子
这种题目难倒不做数据预处理?
新的明天
哈哈,leetcode带锁题find celebrity 还是得O(n)吧
新的明天
假设函数 f(a,b) = 1 代表a认识b, f(a,b) = 0代表a不认识b
每次任选两个a,b, 如果 f(a,b) = 1 那么 a 不是名人 (名人不认识所有人) f(a,b) = 0 那么 b 不是名人 (所有人都认识名人) 所以每次调动函数都可以排除一个人。调动n-1次后就剩名人了
shirleylim1014 发表于 2021-11-26 17:06

正解
M
Mochi诺尔
bubble sort?
h
huawei6g
假设函数 f(a,b) = 1 代表a认识b, f(a,b) = 0代表a不认识b
每次任选两个a,b, 如果 f(a,b) = 1 那么 a 不是名人 (名人不认识所有人) f(a,b) = 0 那么 b 不是名人 (所有人都认识名人) 所以每次调动函数都可以排除一个人。调动n-1次后就剩名人了
shirleylim1014 发表于 2021-11-26 17:06

如果是这个题的话,那比楼主原来的描述清楚多了。 关键条件是名人不认识任何人。如果去掉这个条件,那么假设5个人,假设认识函数形成下面的矩阵: X X X X O X X X O X X X O X X X O X X X X X X X X 只有一行一行的试。最差情况下,n平方
x
xinseesea
回复 21楼shirleylim1014的帖子
你这个是彻头彻尾错的解法。
简单举例, f(a, b), f(a,c)都排除a不是名人。
这个题目应该是O(n)的复杂度, 不过解法不是这样的
h
huawei6g
回复 21楼shirleylim1014的帖子
你这个是彻头彻尾错的解法。
简单举例, f(a, b), f(a,c)都排除a不是名人。
这个题目应该是O(n)的复杂度, 不过解法不是这样的
xinseesea 发表于 2021-11-27 00:48

你咋还理解不了呢,第一个函数后,a就已经排除了,下一个函数不会再出现a了
x
xinseesea
老婆给的解法: O(n) 判断函数 f(A, B) // return 1 means A know B, return 0 means A do not know B. 输入array代表n个人: A[n] // from 0 to n-1;
int findCelebrity(vector<int> A) { int num = 0; for (int i = 1; i < A.size(); i++) { if (f(A[num], A)) { num = i; } } return num; }
x
xinseesea
你咋还理解不了呢,第一个函数后,a就已经排除了,下一个函数不会再出现a了
huawei6g 发表于 2021-11-27 00:58

给你个array: A[n] 你教教我怎么排除,怎么任意选a, b
h
huawei6g
给你个array: A[n] 你教教我怎么排除,怎么任意选a, b
xinseesea 发表于 2021-11-27 01:06

c <- 1 for i in 2:n --- if f(c,i) ------ c <- i return c 这个是你太太的具体实现方法。这就是那个层主说的意思。但是还有其他具体的实现方法。比如从后面往前,而不是从前向后,或者先挑奇的序号,再挑偶的序号。那位层主把最关键的地方说明白了。
x
xinseesea
c <- 1 for i in 2:n --- if f(c,i) ------ c <- i return c 这个就是那个层主说的意思
huawei6g 发表于 2021-11-27 01:14

你不就照着我的写法写了一遍,
和之前说的排除算法完全无关
h
huawei6g
你不就照着我的写法写了一遍,
和之前说的排除算法完全无关
xinseesea 发表于 2021-11-27 01:18

看我改过的回答
x
xinseesea
看我改过的回答
huawei6g 发表于 2021-11-27 01:23

别扯了, 那个写法的思想根本不是挑两个a,b出来之前,一次排除一个。
你就是照着我代码一摸一样抄了一遍,这代码和你36楼自己的思想都完全不一样
h
huawei6g
别扯了, 那个写法的思想根本不是挑两个a,b出来之前,一次排除一个。
你就是照着我代码一摸一样抄了一遍,这代码和你36楼自己的思想都完全不一样
xinseesea 发表于 2021-11-27 01:27

#36 我的意思是说,如果少了一个条件,可以证明,没有比n平方更小的解答
h
huawei6g
别扯了, 那个写法的思想根本不是挑两个a,b出来之前,一次排除一个。
你就是照着我代码一摸一样抄了一遍,这代码和你36楼自己的思想都完全不一样
xinseesea 发表于 2021-11-27 01:27

加油,继续做下一题 Given an array nums with n integers, your task is to check if it could become non-decreasing by modifying at most one element. We define an array is non-decreasing if nums <= nums[i + 1] holds for every i (0-based) such that (0 <= i <= n - 2).
Example 1: Input: nums = [4,2,3] Output: true Explanation: You could modify the first 4 to 1 to get a non-decreasing array. Example 2: Input: nums = [4,2,1] Output: false Explanation: You can't get a non-decreasing array by modify at most one element.
s
sasasasasa
很幼稚,去lc 讨论区自己讨论不好么?以为自己是什么高科技是吧?小学鸡行为。觉得在学校学到个厉害东西吓死人了,老绕脑子了,超级难的脑筋题,回来到处问别人会不会做。你刷你自己题的好吧,周赛global ranking第几啊?在这里到处考那些没有先验知识的人,知不知道你自己一副傻吊样?
h
huawei6g
很幼稚,去lc 讨论区自己讨论不好么?以为自己是什么高科技是吧?小学鸡行为。觉得在学校学到个厉害东西吓死人了,老绕脑子了,超级难的脑筋题,回来到处问别人会不会做。你刷你自己题的好吧,周赛global ranking第几啊?在这里到处考那些没有先验知识的人,知不知道你自己一副傻吊样?
sasasasasa 发表于 2021-11-27 01:50

码农居然成为高工资行业,说明这个国家实业的确不行了。
s
surezzz
回复 1楼gokgs的帖子
正确答案就是O(log(n)),随机算法, walk on a directed graph。
s
surezzz
回复 49楼surezzz的帖子
It’s directed connected graph. The question is similar to finding the root of a tree, with additional requirement of not visiting the same node twice. So it is O(log n).
e
echomom
directed edges graph: all in - all out = #of people-1 is the one.
w
welkin25
别扯了, 那个写法的思想根本不是挑两个a,b出来之前,一次排除一个。
你就是照着我代码一摸一样抄了一遍,这代码和你36楼自己的思想都完全不一样
xinseesea 发表于 2021-11-27 01:27

if (f(A[num], A)) { num = i; }
你写的这个,本质上不就是
如果 f(A[num], A) = 1, 排除 num 如果 f(A[num], A) = 0,排除 i
吗? 跟之前那位层主的解法是一样的,就是任意选 a b 被修改成了按顺序选 a b 而已
m
meidong20
是不是 union find algorithm。
c
cloudymind
假设函数 f(a,b) = 1 代表a认识b, f(a,b) = 0代表a不认识b
每次任选两个a,b, 如果 f(a,b) = 1 那么 a 不是名人 (名人不认识所有人) f(a,b) = 0 那么 b 不是名人 (所有人都认识名人) 所以每次调动函数都可以排除一个人。调动n-1次后就剩名人了
shirleylim1014 发表于 2021-11-26 17:06

见面一次可否让A和B都回答。这样省一半时间。
c
cs5560
被别人认识的得1分,得分最高的就是那个人。
j
jangreen
Interesting