Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面阿里P7,竟问这么简单的题目?

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

作者头像
程序猿石头
发布于 2021-06-10 08:37:31
发布于 2021-06-10 08:37:31
67900
代码可运行
举报
文章被收录于专栏:程序猿石头程序猿石头
运行总次数:0
代码可运行

背景

大家好,我是石头哥。

作为面试官,不管是社招还是校招,我都有多年的经验了。在我参与的所有面试中,我都尽量期望能让候选人有所收获。(当然也期望自己在面试中也有所收获)

当面试完,不管是否通过,当候选人自己或通过 HR 转述表达感激之情时,作为面试官,心理还是蛮高兴的。

HR/候选人的好评

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

在正式解析题目之前,先给大家分享下在阿里在线笔试的流程。

阿里在线 coding

需要说明的是,不同部门,不同面试官可能用到的工具或形式不一样。本文提到的是公司系统推荐工具。

一般笔试前,面试官会通过公司的代码评测系统中,给候选人邮箱发送一份测评邀请。

候选人收到的测评邀请

居然暴露了年少时候的火星文 QQ 昵称?,还记得你第一个 QQ 昵称吗?欢迎评论区留言~

点击链接,会进入到在线编程系统,如下图所示:

阿里在线测评系统

该系统有内置系统题库(如下图,5000+道题目,不过我很少看),其实每个面试官基本都会有自己的小题库的。

阿里面试题库(题目已打码)

根据面试官的风格,可能会选择开启视频,进行视频面试。

候选人可点击左上角切换不用的编程语言,甚至可以切换到 "vim" 模式进行编程。

这里补充分享下石头使用的 vim 插件列表

另外,提醒下大家,这个系统只是实时在线共享编辑,并不像 leetcode 刷题网站那样能直接编译提交。

面试官其实也主要是考察思路,代码编写风格等,并不是说非得你写出代码能够 AC。

题目

下面,回到本文的题目,我将分享在面试过程中遇到的各种场景。

原本以为这道题目是一道非常简单的题目,但在实际面试过程中,部分候选人的表现却有些出乎意料。

题目本身针对社招P6、P7开发岗位。需要说明的是,这个题目只是整个面试过程中的一个很小的考察环节,能够答对这道题目不代表就一定能通过整个面试。

一般这个题目回答完毕后,后面还会有一道题目。不过很多时候,很多人连这道题目也不会。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 有序数组去重 
输入:[0, 1, 1, 2, 3, 3] 
输出:[0, 1, 2, 3]

这也太简单了吧?看到这里,大家先不要慌着急退出。请耐心看完……

面试过程

部分候选人,看到这个题目,然后二话不说,就直接开始写了。

比如,用 Python 的同学可能直接如下;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo = [0, 1, 1, 2, 3, 3]
foo = set(foo)
print(foo)

候选人:写好了。

面试官:恩。set 确实能去重,你这个实现跟 foo 是不是有序是不是没有关系?这个输出是有序的吗? 候选人: set 本来就是升序的。确实跟输入是否有序没关系。

面试官:那题目输入是降序的呢?另外,你知道这个时间复杂度是多少吗? 候选人:如果是降序,那后面输出的时候再 sort 一下就好了。时间复杂度,这个。。。

我们拿到一个面试题目,一定要和面试官先沟通清楚,这个题目需求是什么。沟通,也是面试考察的一个重点。相当于,我们拿到一个产品的需求,得通过来回沟通,揣摩用户需求。

对应到代码面试题而言,就是要通过和面试官沟通,对方期望的是一个怎样的结果。是直接写几行代码解决这个问题呢?还是明确设计一个接口实现,输入输出如何?

类似的,用 Java 的候选人,写出来了如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 应该用得多。

面试官:恩,能完成功能。我把题目明确一下,请自行设计接口(方法)完成上述功能,尽量用时间复杂度低的方式实现。

于是又开始写了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<Integer> func(List<Integer> a);
....

面试官:请注意,编码风格,包括函数、变量命名等都在我们的考察范围。

又改了下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<Integer> quchong(List<Integer> input) {
  ...
}
....

中英夹杂,其实不是很推荐。候选人如果能主动沟通,比如 “去重” 单次一时忘了,先用拼音替换等等都是 OK 的。一再强调,一定要多沟通。

比如比较好的方法签名如下(举例),通过函数名称知道背后的逻辑,入参 sortedData 也能看到,要求输入的有序的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<Integer> removeDuplicated(List<Integer> sortedData) {
}

此时,如果候选人能主动如下沟通,肯定有加分的。

  • 输入都是正整数吗?这里可以设计成泛型(或 C++ 模板),方便扩展,不一定要求是Integer,可以是 Double, Long 等等都可以。我就简单用 Integer 代替了。
  • 输入确保是有序的吗?我有必要检查一遍输入是否有序吗?

接着看函数的实现。

面试官:你可以尝试不用库函数,set, distinct 之类的。充分利用输入是有序数组。你想想,有序数组的特点,如果重复的数字,那么一定是相邻的。

候选人:哦,我好像知道了。

其实,一般这样稍微提示,就能写出来了。

但,还是有部分候选人嘴里知道了,还是长时间没有敲键盘。

面试官:你前后用两个“指针”(下标),前面一个指针 2一直往后找,直到找到一个和指针 1 代表的数字不相同的,是不是就是我们预期想保留的?

其实很多时候,大部分人,还是能写出如下代码的。只是,希望候选人在写代码的时候,一定要注意边界等情况。

候选人答案,大家来找茬

跟我们在写实际项目代码一样,如果是对外暴露的接口,一定要对输入参数进行合法性校验。

面试官: 如果 inputNumbers 为空会怎么样?

候选人:啊,忘了。我再加个为空的判断。

噼里啪啦,加了是否为空的判断了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (Objects.isNull(inputNumbers)) {
  return inputNumbers;
}

面试官: 如果 inputNumbers 数组只含有 1 个元素呢?你的输出是啥?

候选人:啊,有问题。我再改改。

面试官: 你自己再写几个测试用例吧。如果别人设计了这样一个接口,你会从哪些方面考虑去进行测试。

提醒大家,在写完代码之后,一定要注意自测。比较好的候选人一般写完代码之后,会主动自己写几个输入输出自测的。我们在实际项目中也是,要注意自测,写单测覆盖等。

经过来回几次修改,可能代码主题逻辑也写得差不多了。这个时候,可能面试官会进行“压力”面试(面试官可能心里也没有答案)。

面试官:如果我非要你对这段代码进行优化,你会如何优化?我举个例子,比如你的第 7 行代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> distinctNumbers = new ArrayList<>();

面试官可能随时从中跳出一个知识点和候选人进行讨论的。这里,就考察候选人是否对 ArrayList 扩容过程有所了解。

比如前文中 set 的实现,候选人若对某种语言的不熟悉,可以主动讲述对其他熟悉的语言的了解,比如 C++里面的可能有 setunordered_set 不同的实现。作为面试官也不一定清楚的,再次强调,沟通!

面试官:如果允许修改输入数组,怎样实现能使空间复杂度从 O(N) 减小到 O(1)

候选人:好的。那我接口定义稍微改下,不返回了。

这道题目本身其实来源于 Leetcode,我记得不错的话,原题就是直接要求修改原数组的情况下进行提交。

这里也提醒下大家,如果你曾经遇到这道题目。也一定要和面试官沟通清楚题目要求,此题目不一定非此题目。比如,面试官可没说可以直接修改输入?

我印象特别深,在我当初毕业校招面试微软的时候,就遇到了一个自己做过的“原”题,我噼里啪啦写完,最后面试官告诉我,题目 XX条件不一样。

另外,一般在面试过程中,遇到刷过的原题,特别是校招的时候,候选人可以主动提出说这个题目刚做过。我曾经作为候选人参加一些公司的校招时,就被要求如果做过的题目,要主动说。

不过,你不说也无所谓的。一个优秀的面试官,肯定不是为了考查某道具体的题目而考查的。一个优秀的候选人可以给面试官下套引导答题的,可以看看之前分享的面试技巧大厂 Offer 面经和硬核面试攻略

好了,有了前文的基础,可直接修改原输入的情况下,应该能写出来了吧?只需要稍微变动上面的代码即可。

欢迎留言讨论你的答案,让大家来找茬。

后记

题目曝光了,以后面试可能会酌情考虑不出这道题目了。

啊,我好像多虑了。说得好像我公众号阅读很多似的 ? 感觉完全没必要担心呀,毕竟题目也不是我原创的(属于Leetcode超级Easy的题目了)。?

强调一下,面试这道题目并不是想考察这个题目本身,期望以这道题目为契机,考察候选人在解决实际问题时候的沟通能力(本文一直强调多沟通,多沟通,多沟通),逻辑思维方式等。

当然最后也会看看实实在在的 Code,从编码过程中看候选人的编程习惯,编码风格等等。

你可能还对如下文章感兴趣(真人工智能推荐 hhh):

数据结构和算法是重中之重,这里我跟大家推荐一本 Leetcode 刷题指南,质量还挺不错的,推荐给大家参考。获取方式,在公众号后台回复 leetcode01 即可获取。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿石头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
六轮Google 公司面经分享
去年换工作的时候, 面试了一下 Google (这里说的是 Google 中国), 来了个 Google 面试六轮游, 结果是没通过. ? 现在分享下我参与面试的具体流程以及个人认为应该注意的事项,
程序员小猿
2021/01/19
2.4K0
六轮Google 公司面经分享
技术面试中的手撕代码应该如何准备?
不管是秋招还是社招,互联网大厂的技术面试中的手撕代码这一部分总是绕不过去的一关。不只是后端开发和算法岗,现在就连前端、运维、测试、数据等岗位也要考手撕代码了。
五分钟学算法
2023/09/27
2.7K0
技术面试中的手撕代码应该如何准备?
核心技巧!如何应对面试笔试环节中的算法题?
很多人以为做题只会在笔试题当中出现,其实不然,不仅笔试,面试的时候同样会遇到。面试官当场给你出一道题然后在你一个链接,打开是一个编辑器,让你在编辑器当中现场写出解法的代码来。不仅你写代码的时候面试官会全程盯着,而且在你写完之后还会现场给你捉bug,给你指出你做法当中有问题的地方。很多人本来面试就紧张,加上题目往往没有准备出乎意料,当场就蒙住了脑子里一篇空白。我想很多同学应该都有类似的经历。
TechFlow-承志
2021/03/25
9530
「求职」自我介绍这样说,让面试官快速对你产生好感!
在之前的文章中,小火龙和大家分享过完整的面试技巧,感兴趣的同学可以戳下方蓝字部分:
小火龙说数据
2022/12/09
1.1K0
「求职」自我介绍这样说,让面试官快速对你产生好感!
从一道面试题谈起,大厂到底看重程序员的什么能力?
上周的一篇《字符串比较,居然暗藏玄机》,我最早是在唐磊《这10行比较字符串相等的代码给我整懵了》里看到的,我用通俗的语言,展开了“密码破解”案例。文末却没有提引用的出处,这里和唐磊道个歉。
架构师之路
2020/07/02
8300
历经70+场面试,我发现了大厂面试的bug,并总结其中心得
每轮面试的整个流程一般分三部分,第一部让你做个自我介绍,第二部分面试官考察专业能力环节,最后一部分是反问面试官环节。
马士兵的朋友圈
2022/07/30
1.3K0
分享一位同学的阿里、百度前端面经
从决定找工作开始,我其实经历过一系列思想斗争,最开始想的是,等自己完全准备充分之后,再开始投简历面试。然而,由于惰性,我发现自己很难判断什么时候是完全准备好的时候。
zz_jesse
2020/12/08
8910
聊聊算法在面试中的地位
前段时间,有一位好友找到我,向我打听阿里社招笔试是否看重算法题的考察,我给予了肯定的答复。他表现的有些沮丧,表示自己工程底子很扎实,框架源码也研究地很透彻,唯独算法能力不行,leetcode 上的简单题做起来都有点吃力。以至于面试一些公司时,基本都是前几面和面试官聊工程,相聊甚欢,一到笔试就 GG。鉴于我个人在学生时代有过 ACM 经历,对算法还是相当感冒的,个人算法能力不算出众,也不算弱,最好成绩是省赛金牌,区域赛铜牌(主要还是抱得队友的大腿),后来实在是写不动 C++ 了,中途转了 Java,借这个机会跟大家聊一聊,分享下个人对算法的一些认识。
kirito-moe
2020/11/03
7550
面试沟通时的 3 个注意事项
之前写了几篇关于简历和面试经验的文章,很多同学都说很实在,那我趁热打铁,继续从面试官的角度再聊聊面试沟通时的 3 个注意事项。
sylan215
2020/03/03
3010
作为面试官,我是怎么快速判断程序员能力的?
技术面试是一个工程师成长到一定阶段后必然要承担的一项工作,优秀的技术面试官能帮助公司筛选出优秀的工程师,并且潜移默化的吸引候选人选择加入公司。相反,糟糕的面试不仅会错失优秀候选人,甚至还会给公司招来大麻烦。尽管技术面试如此重要,我还是了解到,很多公司的技术面试官都是“无证上岗”,hr 随便抓壮丁去面试,面试质量参差不齐。本文就这个问题,根据我自己的面试经验和思考,总结了一些面试技巧分享跟大家,希望有所帮助。
JAVA高级架构开发
2018/10/11
1K1
作为面试官,我是怎么快速判断程序员能力的?
一个后端朋友面试一个月的经验总结
朋友坐标北京,裸辞在家找工作。线上面试一共58场,投递公司包含a轮-c轮、上市公司或者知名互联网公司,除了中途放弃面试或者谈薪阶段放弃之外,基本做到面试一路绿灯,最后拿到了包括阿里、字节等offer。
全菜工程师小辉
2021/09/10
1.3K0
决定你是否能进字节的几道题
面试官在简单确认候选人姓名并询问侯获选人当前工作地之后,说道 你应该了解字节的面试流程吧?
程序员小熊
2021/05/28
7690
决定你是否能进字节的几道题
站在面试官角度拆解面试20人的体会
大家好,我是雁卿,之前由于职业发展规划,面试了10多家公司,分享了一些面试题目和作为求职者的面试经验。
程序媛淼淼
2022/09/01
6040
站在面试官角度拆解面试20人的体会
盘点今年秋招那些“送命”的算法面试题
随着 2019 年校招结束,“金九银十”的跳槽季也已经接近尾声,不知道在裁员、消减HC、只招中高级岗位等等“悲观”情绪下,你是否已经如愿入职心意的企业?或者还是准备蜷缩过冬厚积薄发?
五分钟学算法
2019/11/09
4250
魔幻2020,收下这份秋招建议,国庆也能好好准备
本周,我们公司的校园招聘也正式启动了,我担任了3天的二面面试官。这是我毕业8年后,第一次以另外一种身份参与到秋招中。
程序员小跃
2020/10/10
3240
魔幻2020,收下这份秋招建议,国庆也能好好准备
我们公司是怎样组织一千场面试的!?
经常会出现的情况是,我们用一两个月的时间找到一个感觉不错的候选人,结果招进来后只能打碎牙齿往肚里咽。
程序员小浩
2021/04/07
1.6K1
技术面试中,什么样的问题才是好问题?
其实很久以前就想谈一谈这个话题了,但是最近才有了足够的动机。因为从最近参加的很多 debrief 来看,我认为身边大多数的软件工程师面试中,在通过技术问题来考察候选人这方面,很多都做得不够好。比方说,我看到对于一些经验丰富的软件工程师候选人的面试,一些面试官依然是草率地扔出一道算法题让做了事,并且认为能不能够比较清晰完整地将代码写出来,是工程师级别裁定的最重要的标准。而这样的做法我认为是非常不妥的。
四火
2022/07/19
3570
动态规划:以前我没得选,现在我选择再爬一次!
之前讲这道题目的时候,因为还没有讲背包问题,所以就只是讲了一下爬楼梯最直接的动规方法(斐波那契)。
代码随想录
2021/02/26
3960
阿里大佬 对 面试八股文的见解!
我最近发现一件有趣的事情,很多同学去一家公司面试,往往技术面挂了之后,说的最多的一句抱怨的话就是:“沙雕面试官从头到尾全程问八股文,其他方面的问题一句都不问,垃圾!!!”
田维常
2023/10/28
1.2K0
阿里大佬 对 面试八股文的见解!
作为字节跳动的研发面试官,有些话我不得不说!
2019春招过半,面试也进行了两场,在整个面试过程中,我不断被同学问到各式花样问题:
本人秃顶程序员
2019/04/21
4.4K0
作为字节跳动的研发面试官,有些话我不得不说!
推荐阅读
相关推荐
六轮Google 公司面经分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验