Meta SWE New Grad面试题和答案
New Grad Interview Questions & Answers
刚面完Meta的New Grad,感觉人已经麻了,赶紧趁热打铁给兄弟姐妹们分享一下最新的面经和一些心得,希望能帮到大家。说实话,Meta的面试流程还算清晰,但每一轮都不能掉以轻心,尤其是Coding Round,那真是有点强度的。
我的整个流程是这样的:先是OA,然后直接就是Virtual Onsite。中间没有Phone Screen,可能是因为校招季流程简化了。OA是在一个叫CoderPad的平台上做的,两道LC Medium难度的题,限时90分钟。题目不难,但要考虑各种edge case,而且时间有点紧,我当时第一道题就卡了20分钟,心态差点崩了。
Virtual Onsite就更刺激了,一天之内面四轮,两轮Coding,一轮System Design,还有一轮Behavioral。强度直接拉满,面到最后感觉脑子都空了。下面我详细说说每一轮的感受和题目。
Coding Round
两轮Coding都是45分钟,每轮两道题,一道Easy一道Medium。面试官会先简单聊几句,然后直接上题。重点是一定要跟面试官沟通,把你的思路讲清楚,即使你没法立刻写出最优解,也要让他知道你在想什么。千万别埋头苦写,踩过坑的人都知道,沟通比完美代码重要。
第一题:Valid Palindrome II (LC 680变种)
题目:给一个String,问最多删除一个字符的情况下,能不能让它变成一个回文串。
解题思路: 这题是经典的Two Pointers问题。我们用两个指针,一个从头走,一个从尾走。如果两个指针指向的字符相同,那就继续往中间走。如果不同,说明我们必须删除其中一个字符了。这时候就有两种可能:要么删除左边的字符,要么删除右边的字符。我们就分别检查这两种情况下,剩下的子串是不是回文串。只要有一种情况是回文串,那结果就是true。这里可以用一个helper function来检查子串是否是回文,代码会更清晰。
代码框架 (Python):
def valid_palindrome(s): left, right = 0, len(s) - 1 while left < right: if s[left] != s[right]: # Try deleting left or right character return is_palindrome(s, left + 1, right) or is_palindrome(s, left, right - 1) left += 1 right -= 1 return True
def is_palindrome(s, left, right): while left < right: if s[left] != s[right]: return False left += 1 right -= 1 return True
第二题:Number of Islands (LC 200)
题目:给一个二维的Grid,'1'代表陆地,'0'代表水。问这个Grid里有多少个岛屿。
解题思路: 这题是典型的Graph遍历问题,可以用DFS或者BFS来解。我个人比较喜欢用DFS,感觉写起来更顺手。我们的思路是,遍历整个Grid,只要遇到一个'1',就说明我们发现了一个新的岛屿,这时候就把计数器加一。然后,从这个'1'开始做DFS,把所有和它相连的'1'都标记成一个特殊字符(比如'#'),表示这块陆地已经被访问过了,避免重复计算。这样等我们遍历完整个Grid,计数器的值就是岛屿的数量。Time Complexity是O(mn),Space Complexity最坏情况下也是O(mn)。
代码框架 (Python):
def num_islands(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) count = 0 for r in range(rows): for c in range(cols): if grid[r][c] == '1': count += 1 dfs(grid, r, c) return count
def dfs(grid, r, c): rows, cols = len(grid), len(grid[0]) if not (0 <= r < rows and 0 <= c < cols and grid[r][c] == '1'): return grid[r][c] = '#' dfs(grid, r + 1, c) dfs(grid, r - 1, c) dfs(grid, r, c + 1) dfs(grid, r, c - 1)
第三题:Binary Tree Right Side View (LC 199)
题目:给一个Binary Tree,想象你站在树的右边,返回你能看到的节点的值。
解题思路: 这题的本质是让你找到每一层最右边的那个节点。最直接的方法就是用BFS,也就是层序遍历。我们用一个Queue来辅助。每一轮,我们处理当前层的所有节点,并且把下一层的节点都加到Queue里。关键点在于,在处理每一层的时候,我们只把最后一个节点的值加到结果里,因为它就是从右边能看到的那个节点。这个方法很直观,而且Time Complexity和Space Complexity都是O(n)。
代码框架 (Python):
class TreeNode: def init(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right
def right_side_view(root): if not root: return [] queue = [root] result = [] while queue: level_size = len(queue) for i in range(level_size): node = queue.pop(0) if i == level_size - 1: result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result
System Design
New Grad的System Design轮,说实话更像是Product Design。面试官不会要求你设计一个像Facebook一样庞大复杂的系统,而是会给一个相对简单的场景,看你能不能把一个产品的基本功能和架构想清楚。我被问到的是“Design a URL shortener service like TinyURL”。
我的建议是,一定要先和面试官clarify requirements。比如,这个服务的QPS有多高?生成的URL需要是永久有效的吗?需不需要自定义URL?这些问题都能帮你把问题范围缩小。然后,从High-level的架构开始,画出主要的components,比如Web Server, Application Server, Database。接着再深入到每个component的细节,比如API的设计,Database Schema的设计。最后,一定要讨论scalability的问题,比如怎么用Load Balancer,怎么用Cache来提高性能。血泪教训,别忘了讨论trade-offs,这是加分项。
Behavioral
Behavioral轮其实贯穿始终,每轮面试官都可能问你几个。但最后会有一轮专门的Behavioral Interview,通常是和一个Engineering Manager。问题都是那些经典款,比如“Tell me about a challenging Project”,“Tell me about a time you had a conflict with a teammate”。
准备这轮的关键就是,提前准备好你的故事。每个项目,每个实习,都挖出几个有亮点的故事,然后用STAR原则(Situation, Task, Action, Result)把它们包装好。面试官想听的不是你做了什么,而是你为什么这么做,你学到了什么,你给团队带来了什么impact。记住,自信、真诚、有逻辑,比什么都重要。我当时准备了大概5个故事,反复练习,确保能流利地讲出来。
总之,Meta的面试体验还是不错的,面试官都很nice,题目也都是LC上比较经典的。希望我的分享能给大家带来一些帮助,少走一些弯路。祝大家都能拿到心仪的Offer!
#Meta #面试 #面经 #SoftwareEngineer #NewGrad #求职 #北美求职 #CS #FLAG #找工作
