今天明显比上次答得好. 三道题, 45 分钟, 作对了两道半. 说明一个道理, 你就是要不断的进击, 不用等到 100% 准备好, 完全准备好的情况是不存在的.
两分钟自我介绍, 10分钟项目经验, 谈自己有突出贡献的项目.
(今天没有让选作 OOD, 操作系统, 测试, 前端 和 产品, 这些都是我的短板. 今天比较幸运)
稍微介绍了一遍白板答题软件, https://coderpad.io
可以测试不熟悉的函数, 可以试运行, 打印中间结果 等等. 挺好用的, 我喜欢.
..
下面就是今天的主食:
输入, 是一个家族图谱.
11 1 7 / / 3 5 / 2 4
parent_child_paires = [(1, 3), (1, 5), (7, 5), (5, 2), (5, 4), (11, 7)], 用二元 tuple 数组表示.
Problem 1: 返回两个数组, 一个是没有儿子的全部节点, 一个是只有一个儿子的所有节点.
Problem 2: 找两个节点有没有共同祖先, 返回 True or False. i.e. (1, 3) return False, (3, 4) return True, (2, 7) return True
- 1, 3 不算, 必须是自己以外的父节点, 跟 LCA 的定义不同.
Problem 3: 找到一个节点的最早的祖先. i.e. input = 2, return 11; input = 3, return 1
心得:
今天和考官的沟通到位, 一路畅谈, 确认题目的要求, 哪些边界情况需要处理, 中途想到的各种思路和逻辑, 偶然寻求考官的认可(或者否定).
也可以征求提示, 在走不动的情况.
令狐冲老师说了, 下面两种风格都可以:
1. 开始确认题意, 简单描述思路, 然后闷头写代码, 跑测试, 最后做个总结, 简单走一遍代码逻辑, 说出时间和空间复杂度.
2. 从头到尾不断的和考官交谈. 集中在 clarify problem, think out loud 表达自己的思路. - 可能比较浪费时间.
另外, 很多情况下,题目不需要高深的算法和数据结构, 简单的方法能做出来, 就先实现一个. 然后慢慢优化.
比如今天的题目我首先就想到 Graph, BFS, 拓扑排序 等等, 然后才想到 hash map, Counter 等等, 通过沟通思路, 敏锐的察觉到根本没必要走高端.
我是用 递归 Recursive 做的, 堆栈消耗更多空间和时间. BFS + 队列, 空间和时间都优于递归.