上午九点五十分,林晨坐在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,从数组到图论。失业的压力转化为刷题的动力,常常一天八小时坐在电脑前,直到眼睛发酸。
此刻,那些深夜的坚持开始兑现。
他先写下函数签名,然后快速分析:因为有重复元素,当 nums[mid] == nums[right] 时,无法判断最小值在左侧还是右侧,此时只能将右指针减一。时间复杂度最坏会退化到O(n),但平均仍是O(log n)。
指尖在键盘上飞舞:
def findMin(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[mid] > nums[right]:
left = mid + 1
elif nums[mid] < nums[right]:
right = mid
else: # nums[mid] == nums[right]
right -= 1
return nums[left]
写完,他检查了一遍边界条件,点击运行。
测试用例通过。
“AC了”。王磊看着iPad上的反馈,点点头,“时间三分十二秒,很快。能解释一下为什么 nums[mid] == nums[right] 时要 right -= 1 吗”?
林晨转向白板,画了一个数组示意图:“比如 [3,3,1,3],初始时 left=0, right=3, mid=1。nums[1]=3, nums[3]=3,相等。此时我们无法判断最小值在左边还是右边,但可以确定的是,去掉最右边的元素不会丢掉最小值,因为 nums[right] 和 nums[mid] 相等,所以可以安全地将 right 减一”。
“正确”。王磊在iPad上做了记录,“下一题”。
第二题:接雨水 II
题目描述:给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图。请计算这个形状可以接多少雨水。
难度标签:Hard。
二维接雨水,比一维难得多。林晨记得
>>>点击查看《AI时代:码农的涅盘重生》最新章节