今天面试遇到的情况

2021-01-28 16:49:15 +08:00
 cxe2v

今天面了一家做笔记的厂,是手写代码面,第一个题就是奇偶排序的问题,题目如下

input: [2,1,5,7,4,9,8,5,6] output: [1,5,7,9,5,2,4,8,6]

输入一个整数数组,期望输出的数组里,奇数在前边,偶数在后边

我想这不简单么,我有好几种办法可以实现这个功能,然后我就写下了如下代码

    function filter(originArray) {
        let oddArray = [];
        let evenArray = [];
        originArray.forEach(item => {
            if (item % 2 == 1) {
                oddArray.push(item);
            }
            else {
                evenArray.push(item);
            }
        })
        return oddArray.concat(evenArray);
    }

其实我还有以下办法可以实现

    function filter(originArray) {
        originArray.sort((a, b) => {
            return b % 2 - a % 2;
        })
        return originArray;
    }

    function filter(originArray) {
        return originArray.filter(a => {
            return a % 2 == 1;
        }).concat(originArray.filter(b => {
            return b % 2 == 0;
        }));
    }

但是我没想到,面试官其实是想考察双指针排序的变种,我对这种双指针得问题本来就不熟,就卡在这问题上搞了 20 来分钟,整得我都没脾气了,汗都整出来了,后面又考察了一个问题,我只知道原理,让我手写又一次写错,就尴尬地结束了这一次面试。

可能刚好对方的实际项目中需要解决这类算法的问题,面试没面好是我的问题,

我想说的是,对于一个问题,没能按面试官想的方式解决,是不是就算活不好了?

9306 次点击
所在节点    职场话题
68 条回复
lcc142625
2021-01-28 17:07:03 +08:00
这种呢,不能说你的问题,我也遇到过,就是面的时候卡壳想不出来题解,不过那会我面的滴滴的,起码面试官还给我思路,不至于一直两个人尴尬着,有些问题我回头想,能理解也能做出来,但是面试真就紧张,就会怯场,害,这个别太影响你下回面试,每家面试套路都不一样
cxe2v
2021-01-28 17:11:00 +08:00
@lcc142625 #1 我这个面试官也是给了我提示我才知道他想要用双指针的,也没有说一直尴尬,因为是在网页上写代码,滴滴我面过,运气好到没有做任何题就直接到了终面然后被 pass 了,运气啊真的是实力的一部分
carlclone
2021-01-28 17:13:34 +08:00
啥双指针, 他是想你原地排序吧, O(1)空间复杂度 , 我知道的一个方法是用快排的分区思想, 写起来也不算很简单
v2webdev
2021-01-28 17:14:22 +08:00
这题用双指针怎么做?
carlclone
2021-01-28 17:14:36 +08:00
@carlclone 看错题目了...
lcc142625
2021-01-28 17:19:12 +08:00
emm,运气,看面试官和你对不对眼了,我就是,面试类似走了流程直接过了,莫心焦,我也是面了两个月左右才找到的
lemon94
2021-01-28 17:24:50 +08:00
如果面试官没限定你使用内存的空间,那你的解法没什么问题。
如果限定你原地,那你的方法就不行了。
fiypig
2021-01-28 17:28:22 +08:00
一般来说解决问题以后再来谈优化,你没错的
hello2060
2021-01-28 17:29:57 +08:00
开始写之前多和面试官沟通呗,或者先把思路说一遍,如果是他要的你再开始写。

不过这个题一看你开了新数组应该就不是他要的哈,不然谁都会啊。

类似于快排,一个指针 i 初始化为 0,p=-1,如果偶数 i++,如果是奇数 swap(++p, i); i++
不过他确实要把条件先告诉你,比如不能利用额外空间
djFFFFF
2021-01-28 17:38:59 +08:00
即使是不从算法复杂度(常数优化)的角度考虑,你的做法涉及 array 对象创建(还没指定大小,后续可能涉及 array 扩容),cpu 指令数还是比原地排序要多很多的。当然没多到指数级别就是了。
我是面试官的话,我会觉得你能干活,但不抠细节。所以看你面的是什么岗位以及这个岗位的要求是什么了。
ccvzz
2021-01-28 17:39:52 +08:00
```javascript
function filter(arr) {
const ret = [...arr];
let lo = 0, hi = 0;
// arr[0:lo] is odd
while (hi < ret.length) {
if (ret[hi] % 2 == 0) {
hi++;
} else {
[ret[lo], ret[hi]] = [ret[hi], ret[lo]];
lo++;
hi++;
}
}
return ret;
}
```

双指针做法,我自己测试了一下貌似没啥问题
cxe2v
2021-01-28 17:42:26 +08:00
@djFFFFF #10 你这个说的有道理,原地排序确实省资源,至于面的岗位,面试官也不清楚具体干啥
djFFFFF
2021-01-28 17:47:50 +08:00
@cxe2v 那我觉得面试官自己也没想好他的面试方式是否正确,是否能帮公司招到合适的人。
devfeng
2021-01-28 17:55:26 +08:00
可能是你面试经验少了,现在都这个套路,给一个算法题,给出最优解才能接着聊。ps.之前面试遇到个差不多的题,也是双指针,要求奇数在奇数位,偶数在偶数位。
ttys001
2021-01-28 17:56:53 +08:00
x = [2,1,5,7,4,9,8,5,6]
def odd_even(x: list, l: int, h: int) -> list:
for i in range(l, h):
for j in range(i, h):
if x[j]%2 == 0 and x[j+1]%2 == 1:
x[j], x[j+1] = x[j+1], x[j]
return x
odd_even(x, 0, len(x)-1)
这叫冒泡法嘛?
chocovon
2021-01-28 17:59:43 +08:00
我倒是觉得,如果是面对某个性能要求不高的业务问题,你的代码才是好代码,做到了就事论事,没有引入不必要的复杂性
isRealLeven
2021-01-28 18:03:24 +08:00
也许是你刷题刷少了。本来题目不难,而且说明了双指针。应该很快就能做出来
javapythongo
2021-01-28 18:04:29 +08:00
@ccvzz 题目要求奇偶顺序后,还要求相对奇数 /偶数之间的相对位置大小不能变
cxe2v
2021-01-28 18:08:10 +08:00
@isRealLeven #17 对的,就是题刷少了,算法题真的刷得少
wjploop
2021-01-28 18:08:53 +08:00
理解题意确实很重要,咋一看我以为“奇数序列”和“偶数序列”要求有序,若是这样,改变了“两个数的比较规则”而已,用常用的排序方法就行,时间复杂度必然大于等于 nlogn (不考虑桶排序)。
既然没有要求,时间复杂度就可以降到 O(n)了,作为面试题,这题的应该隐含了一个硬性要求“空间复杂度为 O(1)”。 那么,确实是用双指针的做法了。简单的思路就是,
假设目标序列为左边奇数右边偶数,
设立左右指针,左指针指向 0, 右指针指向 len - 1
左指针往右移动一直遇到偶数停住 i,右指针往左移动直到遇到奇数停住 i,交换这两位置的数
不断重复以上操作,直到两指针相遇结束

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

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

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

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

© 2021 V2EX