1. Algorithm
题目: 94. Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
Solution1: 递归
时间复杂度: O(n), 空间复杂度O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
vals = []
self.inorderTranversalHelper(root, vals)
return vals
def inorderTranversalHelper(self, root: TreeNode, vals):
if root is None:
return
self.inorderTranversalHelper(root.left, vals)
vals.append(root.val)
self.inorderTranversalHelper(root.right, vals)
Solution2: 迭代
时间复杂度: O(n), 空间复杂度O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
result, stack = [], [(root, False)]
while stack:
node, is_visited = stack.pop()
if node is None:
continue
if is_visited:
result.append(node.val)
else:
stack.append((node.right, False))
stack.append((node, True))
stack.append((node.left, False))
return result
2. Review
Why I studied full-time for 8 months for a Google interview
Coding Interview University
Google可能是很多程序员心中的圣地,而这篇文章就讲述了作者是如何花费了8个月时间全身心为去Google面试做准备的,作者之前的经历其实已经很丰富了,有着丰富的开发经验,能力也很强,自己开过3个公司并且其中的2个正在盈利。作者选择去Google的背景我就不细说了,Google也是他心目中最想去的公司,所以作者制定了一系列的计划并且严格去执行,作者在GitHub上建了一个项目,帮助人们进行知识点的复习,把自己复习的各种资料以及自己的一些经验之谈都写在了里面,可以帮助别人更好地进行面试准备的复习。虽然最终作者没有进入Google,而是进了亚马逊,但我还是很佩服作者,佩服作者有勇气去挑战自己,并且一直坚定自己最初的目标,希望自己也可以像他一样,去挑战更大的目标,不要只是为了生存,屈服于各种压力之下。
3. Tip
Alfred
alfred_workflows
之前一直听说Alfred很好用,自己也下载下来用了一下,但是也只是粗浅的使用,感觉还不如Mac自带的Spotlight Search顺手,虽然一直都是开机启动的,但是自己从来没有用过它,自己也知道自己觉得它没用是因为自己没有去了解它的特性,但是自己也一直没有花时间去了解和学习。直到周末突然心血来潮想要去深入学习一下Alfred,当花了十几分钟看了一个视频,突然很后悔自己没有早点去学习Alfred的使用,因为学习成本并不高,但是回报却很丰厚,学完之后,我立马就买了Mega Support。
Alfred的搜索很好用,可以搜索文件,搜索网站,不用去打开专门的网站进行搜索,只需要在Alfred的搜索框中输入快捷字+要搜索的内容就可以了,例如: "images dog"就会在Google图片中搜索dog,"translate dog"就会在谷歌翻译中查看dog,"amazon 算法导论"就会再亚马逊搜索算法导论,自己也可以设置以一些自己常用的网站,比如淘宝京东之类的,当然还可以输入相关的快捷字来进行关机、重启、睡眠、清空废纸篓等等的操作,简直不要太方便了有没有。
当然Alfred最牛逼的功能是Workflows,可以自定义一些功能来扩展Alfred,你可以把自己常用的一些操作组合进行快捷键或者关键字绑定,从而极大地提升效率,比如我自己经常会同时打开某两个相关的目录,那么我就可以把这些操作进行绑定,使用快捷键或者关键字进行同时打开,网上有一些别人的workflow,我们可以使用,我们也可以自定义自己的workflow,从而让自己的电脑使用效率更高效。上面的第二个链接就是github上维护的一个workflows。
4. Share
上周分享了《逆商》的理论基础部分,这周就分享一下方法论部分吧,也就是如何提升我们的逆商。
书中提到了两个方法: 止念法和LEAD法。
-
止念法
止念法又分为分心法和重塑法。分心法旨在帮助一个人立即打断自己的消极反应,防止我们无休止地把注意力停留在消极思维和感受上;重塑法是让一个人正确理解自己身处的逆境,从而停止灾难化。
书中提到的基于分心法的策略:- 通过一些练习,使得一些行为可以让我们立刻就能把思维停止,比如说用力拍手,或者大喊一声"停"等等,这些其实是一种锚定行为,就像巴普洛夫的狗一样,我们可以驯化我们自己,让我们在做出某种特定行为之后拥有某些特征的感受和结果;
- 通过关注一个不相关的事物来达到把自己从消极思维中解救出来的目的,从而让我们停止把一些消极的事情灾难化;
- 在手腕处绑一个橡皮筋,通过橡皮筋弹手腕打断消极思维模式,把负面思想赶走;
- 通过一些积极的干扰,可以让自己不去关注眼前的逆境,比如说听音乐、看喜剧以及搞笑的电影等等;
- 通过运动来改变自己的心态。
书中提到的基于重塑法的策略:
- 问自己一些问题,比如说自己的目标什么,什么对自己来说是最重要的等等,从而把自己从各种细枝末节中解脱出来,回归到真正有意义的事情上去;
- 渺小化,可以让自己置身于某个环境中,让周围的事物把自己衬托得很渺小,通过换个环境来打断自己的消极反应,去找那些可以让自己更加平静或者开心的环境;
- 帮助他人,帮助那些遭遇更大挫折的人们,你会发现自己是多么的幸运,自己碰到的挫折和问题是多么的微不足道。
LEAD法
LEAD工具基于这样的观点: 我们可以通过改变思维习惯来改变成功率。这种改变是通过质疑以前的模式并有意识地构建新的模式来实现的。
L=Listen,倾听自己的逆境反应,也就是观察和反思自己的反应,去思考自己应对逆境的反应是高逆商反应还是低逆商反应,在哪个维度得分最低或最高。
E=Explore,探究自己对结果的担当,去思考自己应该对结果的哪些部分承担起责任,不应该对哪些部分担责。
A=Analyze,分析证据,分析有哪些证据表明自己无法掌控,有哪些证据表明这次的困境会蔓延到生活的其他方面,有哪些证据表明这次逆境会持续很长时间。
D=Do,行动,去做一些事情来获得对形势的一点掌控感,去做一些事情来限制困境的影响范围,去做一些事情来限制逆境的持续时间。