加拿大高贵林Pinterest面试经验算法问题leetcode 551和python代码解法分享与讨论

前阵子整理面试笔记,翻到 LeetCode 551 这题 Student Attendance Record I,顺手又把当时准备 Pinterest 算法面的时候思路捋了捋。题不难:给个只包含 A、L、P 的字符串,A 代表缺勤,L 是迟到,P 正常;要求 A 少于 2 个,且不能有连续三个 L,满足就返回 true。看着像签到题,但真写面试里,边界一点儿没注意就翻车。题目在 LeetCode 551,我习惯先确认输入会不会空字符串,会不会出现别的字符,确定没问题再动手写。

我一般在家里 Coquitlam 刷的时候,先写最简单的 Python:def checkRecord(self, s): return s.count('A') < 2 and 'LLL' not in s。这写法时间复杂度 O(n),空间 O(1)。面试官要是不满意不用内置函数,就写个循环扫一遍,维护 A 的数和当前连续 L,遇到 P 或 A 连续 L 清零,一旦 a_count >= 2 或 consec_l >= 3 就 false。

例子挺好记的:PPALLP 返回 true,PPALLL false,AA 也 false。面试的时候别急着直接甩一行代码,先说清规则,“A 最多一个,不能有连续三个 L”,代码写好跑几个边界测试。Pinterest 招聘信息我也只看官方 Pinterest Careers,具体轮次团队啥的别听网上那些“内部爆料”,看看心理准备就行。

这题放在算法面里,更多考你沟通和边界感,不是考你背没背过。我一般先写用内置函数的版本,再问面试官要不要展开成循环版;时间够的话两个都写上,思路显得完整点。你们遇到这种简单题是直接一行带过,还是老老实实写循环啊?

LeetCode 551 这题我也刷过,同意你说的——看着简单但细节很容易漏。我之前就栽在连续 L 的判断上,没想清楚是要 check ‘LLL’ 这个 substring 还是维护计数器,结果磨蹭了好久。

你那个一行代码的方案确实简洁,但我现在倾向于先写循环版,因为算法面试官往往就是想看你怎么思考边界的。直接甩 'LLL' not in s 有点像投机取巧,面试官可能转身就问"如果不能用字符串搜索呢",那时候现写循环就有点尴尬了。还是把状态维护那套逻辑写清楚,显得更扎实。