ARTS(09)

90 阅读4分钟

什么是 ARTS?

  1. 算法(Algorithm): 每周至少一道 LeetCode 算法题,加强编程训练和算法学习
  2. 阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平
  3. 技巧 (Tip):学习至少一个技术技巧,总结、归纳日常工作中遇到的知识点
  4. 分享(Share):分析一篇有观点和思考的技术文章,建立影响力,输出价值观

时间周期

2022年3月7日至3月13日

一:算法:

对称二叉树

给定一个二叉树,检查它是否是镜像对称的。



例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3


但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3


进阶:

你可以运用递归和迭代两种方法解决这个问题吗?

前置知识 思路: 遍历每一个节点的时候,如果可以通过某种方法知道它对应的对称节点是谁,这样的话直接比较两者是否一致就可以了。 因此可以两遍遍历,第一次遍历的同时将遍历结果存储到哈希表中,然后第二次遍历去哈希表取值。这种思路可以,但是需要N的空间。 如果两者同时进行遍历,是不是就省去了哈希表的开销。

代码

JavaScript 实现及其拓展资料

function isSymmetric (root) {
  return check(root, root)
}
function check (p, q) {
  if (p == null && q == null) {
    return true
  }
  if (p == null || q == null) {
    return false
  }

  return p.val == q.val && check(p.left, q.right) && check(p.right, q.left)
}

Java 实现及其拓展资料

class Solution {
  public boolean isSymmetric(TreeNode root) {
    return check(root, root);
  }
  public boolean check(TreeNode p, TreeNode q) {
    if (p == null && q == null) {
      return true;
    }
    if (p == null || q == null) {
      return false;
    }
    return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);
  }
}

Go实现及其拓展资料

 func isSymmetric(root *TreeNode) bool {
  return check(root, root)
}

func check(p, q *TreeNode) bool {
  if p == nil && q == nil {
    return true
  }
  if p == nil || q == nil {
    return false
  }
  return p.Val == q.Val && check(p.Left, q.Right) && check(p.Right, q.Left) 
}

二:阅读,英文技术文章

5 Whys原则:出现问题时强迫自己进行深入思考 Root Cause Analysis - The 5 Whys Technique

我的总结: 选这篇英文文章单纯是的在分享中提到了5 Whys思考方式,然后我有查阅了一些文档,发现英文对其解释通俗易懂,既能提高下英文,也能学习一种新的思考方法,一箭双雕

三:技巧

你真的会问问题吗? 文章链接:02 | 你真的会问问题吗?-极客时间 搭配阅读:提问的智慧:github.com/ryanhanwu/H…

我的总结: 好的问题等于答案的一半,尤其是作为程序员,遇到问题(bug)、解决问题(bug)几乎是程序员的工作日常,如果更好的通过解决问题来成长,程序员几乎天然需要这个问问题的方式

四:分享

使用简单的逻辑方法进行独立思考 文章链接:coolshell.cn/articles/20…

我的笔记:

  1. 这个文章讲了什么? 如何在这个复杂的世界里使用简单的逻辑进行独立思考

  2. 作者具体是如何说的? 作者使用数学逻辑的方式进行思考,可具体分为五步: 第一步:信息数据可考证。对于一个观点或见解,首先要进行的是数据的查证,Wikipedia会是个好地方

第二步:处理集合和其包含关系。比如:哲学家是人,柏拉图是哲学家,所以,柏拉图是人。避免地图炮、否定整个人等简单的思考方式

第三步:处理逻辑因果关系:要分辨充分条件、必要条件和充分必要条件,然后处理其中的逻辑是否有关联性,而且有非常强的因果关系。比如:因果关系是经常被模糊和偷换的,努力并不直接导致成功,加班并不直接增加产出

第四步:找到靠谱的基准线:就像写代码遵循业界最佳实践,所以做事或看书时,找到世界或国际的通行标准,以此为基础进行下一步行动

第五步:更为深入和高纬的思考。不只是在表面进行思考,在思考时对自己进行5个为什么的提问(参考这篇文章的解释:Root Cause Analysis - The 5 Whys Technique

  1. 作者说的有道理吗?是全部有道理,还是部分有道理? 作者说的很有道理,他的五步思考方式真的好,我要学习并应用起来,我现在越发感觉自己从智力和精力上都是普通人,只能靠习惯+学习其他人好的方法来弥补了。运用他的五步思考法,真的能够解决我自己长久以来的某些问题

  2. 这篇文章跟我的关系 更新迭代我的思维方法,真的很重要。年纪到了,精力和智力都大不如前的情况下,要从其他方向上进行弥补了,而思考方式就是我要弥补的一个方向