面阿里P7,竟问这么简单的题目?

背景

作为面试官,不管是社招还是校招,我都有多年的经验了。在我参与的所有面试中,我都尽量期望能让候选人有所收获。(当然也期望自己在面试中也有所收获)
当面试完,不管是否通过,当候选人自己或通过 HR 转述表达感激之情时,作为面试官,心里还是蛮高兴的。


今天分享的这个问题是我在最近的阿里社招面试中的一道笔试题目。期望通过这道题目的解析,能够让大家了解面试的套路。从面试官角度解读面试过程,希望能让大家有收获。
在正式解析题目之前,先给大家分享下在阿里在线笔试的流程。

阿里在线 coding

需要说明的是,不同部门,不同面试官可能用到的工具或形式不一样。本文提到的是公司系统推荐工具。
一般笔试前,面试官会通过公司的代码评测系统中,给候选人邮箱发送一份测评邀请。


居然暴露了年少时候的火星文 QQ 昵称😑,还记得你第一个 QQ 昵称吗?欢迎评论区留言~
点击链接,会进入到在线编程系统。
该系统有内置系统题库(如下图,5000+道题目,不过我很少看),其实每个面试官基本都会有自己的小题库的。


根据面试官的风格,可能会选择开启视频,进行视频面试。
候选人可点击左上角切换不用的编程语言,甚至可以切换到 "vim" 模式进行编程。
另外,提醒下大家,这个系统只是实时在线共享编辑,并不像 leetcode 刷题网站那样能直接编译提交。
面试官其实也主要是考察思路,代码编写风格等,并不是说非得你写出代码能够 AC。

题目

下面,回到本文的题目,我将分享在面试过程中遇到的各种场景。
原本以为这道题目是一道非常简单的题目,但在实际面试过程中,部分候选人的表现却有些出乎意料。
题目本身针对社招P6、P7开发岗位。需要说明的是,这个题目只是整个面试过程中的一个很小的考察环节,能够答对这道题目不代表就一定能通过整个面试。
一般这个题目回答完毕后,后面还会有一道题目。不过很多时候,很多人连这道题目也不会。
// 有序数组去重 输入:[0, 1, 1, 2, 3, 3] 输出:[0, 1, 2, 3]
这也太简单了吧?看到这里,大家先不要慌着急退出。请耐心看完……

面试过程

部分候选人,看到这个题目,然后二话不说,就直接开始写了。
比如,用 Python 的同学可能直接如下;
foo = [0, 1, 1, 2, 3, 3] foo = set(foo) print(foo)
候选人:写好了。
面试官:恩。set 确实能去重,你这个实现跟 foo 是不是有序是不是没有关系?这个输出是有序的吗? 候选人: set 本来就是升序的。确实跟输入是否有序没关系。
面试官:那题目输入是降序的呢?另外,你知道这个时间复杂度是多少吗? 候选人:如果是降序,那后面输出的时候再 sort 一下就好了。时间复杂度,这个。。。
我们拿到一个面试题目,一定要和面试官先沟通清楚,这个题目需求是什么。沟通,也是面试考察的一个重点。相当于,我们拿到一个产品的需求,得通过来回沟通,揣摩用户需求。
对应到代码面试题而言,就是要通过和面试官沟通,对方期望的是一个怎样的结果。是直接写几行代码解决这个问题呢?还是明确设计一个接口实现,输入输出如何?
类似的,用 Java 的候选人,写出来了如下代码:
public static void main(String[] args) { List<Integer> inputNumbers = Arrays.asList(0, 1, 1, 2, 3, 3); System.out.println(inputNumbers.stream().distinct().collect(Collectors.toList())); }
面试官内心OS:恩,Java 8 stream API 应该用得多。
面试官:恩,能完成功能。我把题目明确一下,请自行设计接口(方法)完成上述功能,尽量用时间复杂度低的方式实现。
于是又开始写了。
public List<Integer> func(List<Integer> a); ....
面试官:请注意,编码风格,包括函数、变量命名等都在我们的考察范围。
又改了下。
public List<Integer> quchong(List<Integer> input) { ... } ....
中英夹杂,其实不是很推荐。候选人如果能主动沟通,比如 “去重” 单次一时忘了,先用拼音替换等等都是 OK 的。一再强调,一定要多沟通。
比如比较好的方法签名如下(举例),通过函数名称知道背后的逻辑,入参 sortedData 也能看到,要求输入的有序的。
public List<Integer> removeDuplicated(List<Integer> sortedData) { }
此时,如果候选人能主动如下沟通,肯定有加分的。
  • 输入都是正整数吗?这里可以设计成泛型(或 C++ 模板),方便扩展,不一定要求是Integer,可以是 Double, Long 等等都可以。我就简单用 Integer 代替了。
  • 输入确保是有序的吗?我有必要检查一遍输入是否有序吗?
接着看函数的实现。
面试官:你可以尝试不用库函数,set, distinct 之类的。充分利用输入是有序数组。你想想,有序数组的特点,如果重复的数字,那么一定是相邻的。
候选人:哦,我好像知道了。
其实,一般这样稍微提示,就能写出来了。
但,还是有部分候选人嘴里知道了,还是长时间没有敲键盘。
面试官:你前后用两个“指针”(下标),前面一个指针 2一直往后找,直到找到一个和指针 1 代表的数字不相同的,是不是就是我们预期想保留的?
其实很多时候,大部分人,还是能写出如下代码的。只是,希望候选人在写代码的时候,一定要注意边界等情况。


候选人答案,大家来找茬
跟我们在写实际项目代码一样,如果是对外暴露的接口,一定要对输入参数进行合法性校验。
面试官: 如果 inputNumbers 为空会怎么样?
候选人:啊,忘了。我再加个为空的判断。
噼里啪啦,加了是否为空的判断了。
if (Objects.isNull(inputNumbers)) { return inputNumbers; }
面试官: 如果 inputNumbers 数组只含有 1 个元素呢?你的输出是啥?
候选人:啊,有问题。我再改改。
面试官: 你自己再写几个测试用例吧。如果别人设计了这样一个接口,你会从哪些方面考虑去进行测试。
提醒大家,在写完代码之后,一定要注意自测。比较好的候选人一般写完代码之后,会主动自己写几个输入输出自测的。我们在实际项目中也是,要注意自测,写单测覆盖等。
经过来回几次修改,可能代码主题逻辑也写得差不多了。这个时候,可能面试官会进行“压力”面试(面试官可能心里也没有答案)。
面试官:如果我非要你对这段代码进行优化,你会如何优化?我举个例子,比如你的第 7 行代码。
List<Integer> distinctNumbers = new ArrayList<>();
面试官可能随时从中跳出一个知识点和候选人进行讨论的。这里,就考察候选人是否对 ArrayList 扩容过程有所了解。
比如前文中 set 的实现,候选人若对某种语言的不熟悉,可以主动讲述对其他熟悉的语言的了解,比如 C++里面的可能有 set 和 unordered_set 不同的实现。作为面试官也不一定清楚的,再次强调,沟通!
面试官:如果允许修改输入数组,怎样实现能使空间复杂度从 O(N) 减小到 O(1)。
候选人:好的。那我接口定义稍微改下,不返回了。
这道题目本身其实来源于 Leetcode,我记得不错的话,原题就是直接要求修改原数组的情况下进行提交。
这里也提醒下大家,如果你曾经遇到这道题目。也一定要和面试官沟通清楚题目要求,此题目不一定非此题目。比如,面试官可没说可以直接修改输入?
我印象特别深,在我当初毕业校招面试微软的时候,就遇到了一个自己做过的“原”题,我噼里啪啦写完,最后面试官告诉我,题目 XX条件不一样。
另外,一般在面试过程中,遇到刷过的原题,特别是校招的时候,候选人可以主动提出说这个题目刚做过。我曾经作为候选人参加一些公司的校招时,就被要求如果做过的题目,要主动说。
不过,你不说也无所谓的。一个优秀的面试官,肯定不是为了考查某道具体的题目而考查的。一个优秀的候选人可以给面试官下套引导答题的,可以看看之前分享的面试技巧,大厂 Offer 面经和硬核面试攻略。
好了,有了前文的基础,可直接修改原输入的情况下,应该能写出来了吧?只需要稍微变动上面的代码即可。
欢迎留言讨论你的答案,让大家来找茬。

后记

题目曝光了,以后面试可能会酌情考虑不出这道题目了。
啊,我好像多虑了。说得好像我公众号阅读很多似的 😝 感觉完全没必要担心呀,毕竟题目也不是我原创的(属于Leetcode超级Easy的题目了)。😑
强调一下,面试这道题目并不是想考察这个题目本身,期望以这道题目为契机,考察候选人在解决实际问题时候的沟通能力(本文一直强调多沟通,多沟通,多沟通),逻辑思维方式等。
当然最后也会看看实实在在的 Code,从编码过程中看候选人的编程习惯,编码风格等等。
你可能还对如下文章感兴趣(真人工智能推荐 hhh):

注意!此信息未认证,请谨慎判断信息的真实性!

全部评论
空

相关内容推荐

头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
2022-12-27 14:35
天津大学_2023
点赞 评论 收藏
转发
点赞 1 评论
分享

全站热榜

正在热议