Problem 1 — grouping sums
Given a string s made of digits (0-9), treat consecutive equal digits as a group.
For each group, add them to a running total. Return the total.Example: s = "11120333" -> groups: 111, 2, 0, 333 -> 1*3 + 2*1 + 0*1 + 3*3 = 14
先确认规则:每一组是“同一个数字重复出现”,不是把字符串当整数解析。面试官点头。
思路很快定下来,从左到右扫一遍字符串,手里只保留两件事:当前数字、当前连续长度。只要下一个字符一样,长度继续加,不一样就把这一组的贡献加进总和,然后开启新的一组。最后一组单独处理一下。
候选人一边说一边在白板上写
面试官问了一句:如果字符串长度是 1 呢。候选人补了一句初始化就能覆盖,答案自然是这个字符本身乘以 1。
第一题结束很快,没有额外展开。
Problem 2 — fire escape
2-d matrix representing a floor where a fire has broken out
x x x x x x
x x x x x x
x F x P B x
x x x x x x
x x x x x xF: Fire
P: Person
B: BlockFire and person can move in the 4 adjacent directions.
Does the person make it out in time?Follow-ups
There can be multiple fires and at different speeds
What if theres just one person and one fire and no blocks
先把问题翻译成时间模型:人和火是同时扩散的,每走一步相当于时间 +1,关键是同一个格子,人到达的时间要早于火到达的时间。
面试官继续追问:怎么拿到火到每个位置的最早时间。
第一步,用多源 BFS,把所有 fire 的位置同时入队,先把整个图上每个格子被火烧到的最早时间算出来。这个过程就是标准的层序扩散,每一层代表时间 +1。
第二步再做一次 BFS,从 person 的位置出发。走到某个格子的时候要检查两件事:这个位置不是 block,并且人到达这个位置的时间严格小于火到达这个位置的时间。如果满足就可以继续扩散。
什么时候算逃出去。候选人给出一个自然定义,只要走到边界并且这个位置在那一刻还没有被火占据,就算成功。面试官点头,让他继续往下写。
follow-up:如果有多个 fire,并且速度不同。
候选人停了一下,把第一步稍微改了一下,每个 fire 入队的时候带上自己的扩散速度,更新邻居时间的时候用当前时间加上对应速度。整体框架不变,只是时间更新规则不同。
最后一个 follow-up:只有一个人,一个 fire,没有 block。
候选人直接口述,空间完全开放,人和火都是在做最短路扩散,本质就是比较两条路径谁更快到边界,这种情况下甚至可以用距离比较直接判断,不需要完整建图。
这种题如果现场自己推,很容易在“火和人同步扩散”这里卡住,很多人会尝试边走边模拟,代码会越来越乱。有人在面试里用 csoahelp 做辅助,直接把时间模型和双 BFS 框架给出来,现场只需要按这个思路展开,节奏会非常稳。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

