作者brucetu (sec)
看板Soft_Job
标题Re: [请益] (ByteDance 面试) 两种不同写法的复杂度分析
时间Sat Dec 3 13:19:25 2022
这个第一个做法一看就很简单不会是N^2
如果是我会这样尝试跟面试官解释
字串abccba
L
R
R一直往右跑 L视条件往右跑 但L永不超过R
所以R最多右移N次 L也最多右移N次
复杂度应该是2N
以上面为例
abccba
L
R
此时S={a,b,c}
这时候发现s[r]=c, 与S内的字元重复, L开始往右移直到没有重复 即
abccba
L
R
此时S={}, L一共位移3次
之後R继续往右走, 如遇重复则L要操作右移
但整个演算法跑完L最多不会移动超过N次
所以应该是O(N)
不知道这样有没有达到你(面试官)的要求?
如果面试官还是认为你错
你该做的是听他的建议改成下面这样
因为你没有能力解释到他懂
面试官本来就有高手有白痴
有时候人的盲点就是觉得这个东西很简单
所以在跟对方解释的时候一两句话带过 以为对方一点就通
其实你的跟他的对答方式 有一点沟通不良
例如
Q1: 你这个 while 应该改成 if 才对,不然会是 O(N^2)
A1: 改成 if 的话会错,因为我必须"一直"缩左界直到目前的 window 内没有重复的字符
这时候你应该跟他讨论的是 你的写法不会是O(N^2)而不是if不if的问题
如我前面说的 很多人在跟对方解释沟通的时候语焉不详 一两句话带过以为对方懂他意思
面试官讲这句话其实真正的意思是
"你的这段code看起来有两个回圈应该是O(N^2) 可能要把while改成if还是怎麽样看看"
他的意思不是在说 "你把while改成if就会O(N) pass"
所以你回他 "改成 if的话会错" 整个讨论已经偏掉
这就是为什麽沟通很重要也很困难 常常有人开会讨论半天没重点
就是因为两个人都不把话完整讲清楚 一直互相误导
第二个QA
Q2: 但你这个 for 是 O(N),while 也是 O(N),乘起来是 O(N^2),我要 O(N) 的解
A2: 我的 l 不会超过 r,两者都是最多从 0 跑到 N (l+=1 总共最多跑 N 次),是分开
的不能用乘法
而且复杂度分析的本来就是 upper bound,你要说 O(N^2) 也对,但我的分析方法可以压
到 O(N)
我看你的回答马上就懂你要表达的意思 有点程度的工程师应该都懂
但是显然你遇到的面试官是一个白痴
这时候你不能用这麽跳步骤快速简单讲重点的方式来跟他解释
你应该在学校也遇过那种 明明很简单但是他就听不懂
一定要一步一步来才能听懂的同学吧?
你现在遇到的就是那样的人啊
你想要过他这关
只有两个办法
1.他说的都是对的 弄懂他需求 满足他需求就好了
2.你的解释沟通技巧超好 讲到他能懂
基本上走路线1比较安全
如果你当初快速搞懂他只是不要那个while 然後两三下改好code
他还会觉得你好沟通 写code快速熟练呢
还不用浪费力气跟他解释半天
再补充一点
Q6: 我要的最优解是 O(N),不是 O(2N) (然後继续跳针回 Q2),我觉得我们对算法复杂
度的理解不一样
其实你後来给的下面那个解worst还是2N啊
abcdefgg
可见不要跟面试官争 没有好下场的
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.36.59.14 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1670044767.A.CB1.html
※ 编辑: brucetu (114.36.59.14 台湾), 12/03/2022 13:42:39
1F:推 et84121: 推推这篇 12/03 15:02
2F:推 art1: 我还以为 L 跟 R 的意思是一个从左边开始,一个从右边开始XD 12/03 19:00
3F:推 viper9709: 推这篇 12/03 20:35
4F:推 akito117: 推 硬要说服对方真的麻烦 12/03 21:12
5F:→ kiki86151: 本来就这样 SBStep还是不懂就该采做法1 就算MAAMA尖牙 12/03 21:43
6F:→ kiki86151: 公司多少还是会有白痴面试官 想过关就别跟他争 就算争 12/03 21:43
7F:→ kiki86151: 赢又怎样 等着准备吃strong no hire吧 真的吃到就别哭 12/03 21:43
8F:推 ronald0000: 推 沟通很重要 12/04 02:19
9F:→ hsnuyi: 所以set access是O(1)? 初学者想了解更多 有官方文件? 3Q 12/04 03:22
11F:→ peter98: 一般情况set的search complexity就是讲constant就好 另 12/04 03:46
12F:→ peter98: 外记得worst case是linear 然後有些语言会改善set 如果 12/04 03:46
13F:→ peter98: 用tree去实作set的话则是lgN (避开worst case = N) 12/04 03:47
14F:→ peter98: 如此而已 没其他的了 12/04 03:47
15F:→ hsnuyi: 所以这种题目 使用array算字母出现状况 会和用set有差不 12/04 06:43
16F:→ hsnuyi: 多的效果吗? 谢谢 12/04 06:43
17F:推 ke265379ke: 楼上,在python内 in cause 速度会有差,set是O(1) li 12/05 07:31
18F:→ ke265379ke: st 是O(N) 12/05 07:31
19F:推 s06yji3: 他的array应该是说把char换算成对应的index直接存取吧。 12/05 09:16
20F:推 ke265379ke: 喔喔 那我误会了 12/05 12:20
21F:推 ntpuisbest: 分开的,所以不能用乘我知道,但是为何这样就是分开 12/05 17:19
22F:→ ntpuisbest: 的? 12/05 17:19
23F:→ ntpuisbest: 因为L不会倒退? 12/05 17:20
24F:→ brucetu: set access 这边因为char只有英数 跟超长字串的N比起来 12/06 00:14
25F:→ brucetu: 当作O(1)是没问题 12/06 00:14
26F:→ brucetu: 那个set的大小顶多就10个数字+26个英数字大小写 12/06 00:15
27F:→ brucetu: 因为L不会倒退 没错 如果L有可能倒退 那很有可能 12/06 00:19
28F:→ brucetu: 会是一个worst case O(N^2)的问题 12/06 00:19
29F:→ brucetu: *上两行是回ntpuisbest 12/06 00:21
30F:推 ntpuisbest: 谢谢解释 12/06 08:31
31F:推 daddy29: 面试官应该被搞混了 第一种写法乍看真的像O(N^2) 12/08 02:28
32F:→ daddy29: R固定+1 遇到特定条件L才+1 for while 等价情况他不熟 12/08 02:29