一个面试题,大家评评理

2023-05-19 18:31:08 +08:00
 gps949

这两天去水了个面试,瞎写了一段代码,姑且不论这段代码能不能实现目标,面试现场 N 个面试官一位很牛逼哄哄地说:这个按理说 O(n)就可以了,你这两个遍历,都 O(n^2)了。
我简单解释两句说内层并不是完整遍历而是在计算连续 0 的长度后会把外层指针 i 移动过这一段,所以本质上还是近似算 O(n)的。
然后那个面试官又一脸不屑的说:你这两层遍历再怎么也不会是 O(n),最多算 O(logn),你回去再好好想想。
然后我无奈:好的。

下面是代码(只是近似,毕竟也没带出来材料)

a=[1,0,1,0,0,0,1,0,0,1,1,1,0,0,0,0,1,0,1,0]
for (i=0;i<a.length;i++) {
    if (a[i]==0) {
        j=i+1;
        for (;j<a.length && a[j]==0;j++) {}
    
        //此处省略一通利用 i 和 j 的判断运算(没有对 i 或 j 的值的改变,也没有任何循环)
    
        i=j+1
    }
}
6506 次点击
所在节点    程序员
63 条回复
buxudashi
2023-05-19 23:31:54 +08:00
分成 2 段共同为 N ,一点不多不少。
NeroKamin
2023-05-20 00:52:45 +08:00
确实是 O(n),但是是不是用双指针写法会更清晰一点?随口一说,没仔细看,可能说错了
tyrantZhao
2023-05-20 07:56:58 +08:00
不去是好事,这对面的面试官压根不懂
vcbal
2023-05-20 10:16:55 +08:00
@hello2090 你把内循环理解成 枚举判断这样就可以了哈,也就是每次循环 内循环只用走常数次 而不是 n 次
sloknyyz
2023-05-20 10:29:18 +08:00
内层还有个 i=j+1,所以即使是全 0 的情况下,也只会遍历一次,这就是 O(N)。
izzy27
2023-05-20 10:59:09 +08:00
没去成是好事,真的
Badlink
2023-05-20 11:13:32 +08:00
典型的双指针啊,面试官水平不好评价,没去也好
arthuryangcs
2023-05-20 13:56:34 +08:00
面试官水平不行
ssw2
2023-05-20 16:49:46 +08:00
是 O(n),但你这写得确实难看
C2Z
2023-05-21 12:35:02 +08:00
虽然感觉写的确实很怪。。但是真的有这种水平的面试吗(纯好奇,刚转码,没有别的意思)
n18255447846
2023-05-21 15:00:52 +08:00
1<log(n)<n<n*n
iosyyy
2023-05-21 18:11:34 +08:00
@ibinary 只有在 m<<<n 的情况下才能视为 o(1)
iosyyy
2023-05-21 18:13:22 +08:00
@ibinary 这段代码确实在 o(n)但是你这个解释完全不对
mmdsun
2023-05-22 09:42:54 +08:00
看到这里你就应该跑了 面试官:你这两层遍历再怎么也不会是 O(n),最多算 O(logn)

logn 不比 n 要快??
WashFreshFresh
2023-05-22 10:13:00 +08:00
确实 logn 比快呀,进来一看差点把我搞懵了。
WashFreshFresh
2023-05-22 10:13:23 +08:00
@WashFreshFresh 打错 是 logn 比 n 快
unco020511
2023-05-22 10:14:30 +08:00
原谅我 你这个两个循环我差点没看明白
zhandi4
2023-05-22 10:25:25 +08:00
@n18255447846 还有一个 nlogn
Huelse
2023-05-22 11:25:20 +08:00
你这第二个循环确实容易误导人,但这面试官水平也有限,所以不必深究。

说不定其他几位面试官是知道的,但是不说,但内心也知道这个人的水平了😎
dode
2023-05-22 12:47:32 +08:00
i=j+1 显然内部循环可以优化外面循环 i 的流程的,这个是面试人员马虎问题,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/941363

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX