第121章 T厂技术一面(1/2)
上午九点五十分,林晨坐在T厂大楼三十二层的一间小型会议室里。
会议室不大,约十平米,一张长方形会议桌,四把椅子,墙上挂着白板。窗户朝东,晨光透过百叶窗在地板上投下斑驳的光影。空气里有淡淡的消毒水味和咖啡香——典型的互联网公司气味。
林晨提前二十分钟到达。前台核对信息后,一位年轻的HR实习生将他领到这里,递上一瓶矿泉水,礼貌地说面试官马上就到。
他打开笔记本电脑,连接电源,再次检查网络。视频面试链接已经发到邮箱,但他被通知第一轮是现场面试。也好,面对面更能展现状态。
九点五十五分,门被推开。
进来的是个三十出头的男性,短发,戴黑框眼镜,穿着深灰色T恤,胸口印着T厂的logo。他手里拿着iPad和一支笔,步伐轻快。
“林晨是吧?我是王磊,AI平台部的算法工程师,今天由我来做技术一面”。他伸出手,笑容温和但透着专业感。
林晨起身握手:“王老师好,我是林晨”。
“坐坐,别客气”。王磊在对面坐下,打开iPad,“简历我看过了,十年跨境电商经验,最近半年自学AI,还做了个量化投资系统”?
“是的”。林晨点头,心里快速调整状态——苏婉说得对,不是接受考核,是展示价值。
“那我们直接开始吧”。王磊推了推眼镜,“先做两道算法题,可以吗”?
“没问题”。
王磊在iPad上操作几下,将屏幕转向林晨。是T厂内部的在线编程平台界面,题目已经加载。
第一题:寻找旋转排序数组中的最小值II
题目描述:假设一个按升序排列的数组在某个未知点上进行了旋转(例如,数组[0,1,2,4,5,6,7]可能变成[4,5,6,7,0,1,2])。数组中可能包含重复元素。请编写一个函数,找出其中最小的元素。
难度标签:Hard。
林晨扫了一眼题目。这是二分查找的变种,经典难题。他曾在LeetCode上刷过类似的题,但包含重复元素会增加复杂度。
“可以用这个平台写,也可以在白板上写思路”。王磊说。
“我直接写代码吧”。林晨将笔记本电脑转向自己,打开编程界面。
手指落在键盘上时,他深吸一口气。这半年,他刷了超过三百道算法题,从Easy到Hard,从数组到图论。失业的压力转化为刷题的动力,常常一天八小时坐在电脑前,直到眼睛发酸。
此刻,那些深夜的坚持开始兑现。
他先写下函数签名,然后快速分析:因为有重复元素,当nus[id]==nus[right]时,无法判断最小值在左侧还是右侧,此时只能将右指针减一。时间复杂度最坏会退化到O(n),但平均仍是O(logn)。
指尖在键盘上飞舞:
deffdM(nus):
left,right=0,len(nus)-1
whileleft<right:
id=left+(right-left)//2
ifnus[id]>nus[right]:
left=id+1
elifnus[id]<nus[right]:
right=id
else:#nus[id]==nus[right]
right-=1
returnnus[left]
写完,他检查了一遍边界条件,点击运行。
测试用例通过。
“AC了”。王磊看着iPad上的反馈,点点头,“时间三分十二秒,很快。能解释一下为什么nus[id]==nus[right]时要right-=1吗”?
林晨转向白板,画了一个数组示意图:“比如[3,3,1,3],初始时left=ht=3,id=1。nus[1]=3,nus[3]=3,相等。此时我们无法判断最小值在左边还是右边,但可以确定的是,去掉最右边的元素不会丢掉最小值,因为nus[right]和nus[id]相等,所以可以安全地将right减一”。
“正确”。王磊在iPad上做了记录,“下一题”。
第二题:接雨水II
题目描述:给定一个xn的矩阵,其中的值均为正整数,代表二维高度图。请计算这个形状可以接多少雨水。
难度标签:Hard。
二维接雨水,比一维难得多。林晨记得这道题要用最小堆(优先队列)加BFS的思路。他从边界开始,将最低的柱子作为“水桶”的短板,向内推进。
思路清晰后,他再次开始编码。这次花了些时间,约八分钟。
iportheapq
deftrapRaWater(heightMap):
ifnotheightMap:
return0
,n=leMap),leMap[0])
if<3orn<3:
return0
visited=[[False]*nfor_range]
heap=[]
#将边界加入堆
forirange:
heapq.heapph(heap,(heightMap[i][0],i,0))
本章未完,点击下一页继续阅读。