ARTS 第 50 周

题图:Photo by James Donovan

每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章

题图:Photo by James Donovan

Contents

Algorithm

101. Symettric Tree

题目:101. Symettric Tree

难度:Easy

题意:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

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

But the following [1,2,2,null,3,null,3] is not:

    1
   / \
  2   2
   \   \
   3    3

解法:

这道题的解法类似于上周的 Same Tree,也是使用递归的思路,判断左节点的左节点是否和右节点的右节点相同,以及左节点的右节点和右节点的左节点相同,因为原来的函数只有一个参数,所以另外定义一个 helper 函数来实现递归。

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if root is None:
            return True
        return helper(root.left, root.right)


def helper(left: TreeNode, right: TreeNode) -> bool:
    if left is None and right is None:
        return True
    if left is None or right is None:
        return False
    return (left.val == right.val) and helper(left.left, right.right) and helper(left.right, right.left)

时间复杂度 $O(n)$,因为我们需要递归所有的节点,递归的次数等于节点个数。

Review

A letter to myself as a fresh software engineer

本周阅读了阮一峰老师推荐的文章《A letter to myself as a fresh software engineer》。

文章以一种亲切的口吻,给刚入行的软件工程师提了一些建议,如「工作是一场马拉松,而不是短跑」、「尊重人,而非头衔」、「工作从白板开始,而非键盘」等等。看起来是一些老生常谈的问题,但仔细研读其内容,你会发现确实如此,而且确实是自己真正会犯的错误(事实上我们也经常陷入这样的误区,即「以为自己知道了,但实际上自己并不知道」)。阮一峰老师说,「新人对这些建议肯定没有很深的体会,但是工作几年以后,再回头看,你会觉得这才是正确的路。」

PS:推荐阅读《人类简史》作者尤瓦尔·赫拉利(Yuval Noah Harari)最近在《金融时报》上发表的这篇长文《The world after coronavirus》,阮一峰老师的网站上也有中文版翻译,大家可以点击阅读原文查看。

Tips

如何将 VS Code 中的插件分享推荐给他人

众所周知,VS Code 已经是如今地球上最流行的代码编辑器了,除了它优秀的性能(可以秒开大型文件)和微软爸爸的强力支持以外,VS Code 最吸引人的还有它的插件(Extensions,Shift+Cmd+X 快捷打开插件市场)。在之前的几期中我已经向大家推荐了一些优秀的插件,这一期就不再推荐插件了,我向大家分享一个将推荐的插件分享给他人的方法。

第一个方法,口述(逃。。

第二个方法,在项目的 .vscode 文件夹下,创建一个文件 extensions.json,在这个 JSON 文件中,你需要提供一个键(Key)叫做 “recommendations”,然后把你要推荐插件的扩展标识符全部放到这个数组中就可以了,插件的扩展标识符可以在插件描述的标题旁边找到。就像这样:

VS Code extentions recommendation

一个写好的 extensions.json 应该差不多长这样:

extension.json example

这样其他人打开这个项目时,如果没有安装对应的插件,VS Code 就会提示他们安装啦。

Share

慢碳水饮食之血糖生成指数

去年秋天,我在两个月的时间内减掉了 6.3 公斤的体重,因为那段时间在增肌,所以净脂肪应该减少了不止这么多。不少朋友都问我怎么做到的,于是我向他们介绍了我采用的慢碳水饮食法。然而最近因为隔离在家,缺少运动,而且很长一段时间没有采用这种饮食方法,我的体重又回涨了两公斤,原本已经消失不见的腰部赘肉又有重新显现的迹象,于是我开始考虑是否要再次采取一段时间的慢碳水饮食,毕竟食物烹饪起来也简单(其实就是,一个人隔离在家不想做饭这是不争的事实。。。)

健身圈的俗话「三分靠练,七分靠吃」,说的就是饮食的重要性。要知道什么是所谓的慢碳水饮食,我们首先需要了解一些营养学的常识。这周我们先讲一个基础概念,「血糖生成指数」,下周我们再来介绍慢碳水饮食的原理和几个重要的原则。

健身先健脑,对于健身的营养学知识,我们需要了解的一个最基础的概念就是「血糖生成指数」,即 GI 值,它是反应食物能引起人体血糖升高程度的指标。

GI 值对比

高 GI 值的食物易消化,吃下去会更快变成葡萄糖,导致血糖更快速地升高,进而促成胰岛素大量生成,将这些还没来得及被利用的葡萄糖转化成脂肪存储起来,相应地,我们也越容易饿。而低 GI 值的食物则正相反,难以消化,饱腹感也比较强,吃下去以后血糖水平不会突如其来地升高,胰岛素也稳定在一个较低的水平。

看完这段是不是就明白了为啥你总是很容易就饿了。。。

实际上,经常吃高 GI 值食物的人,因为体内血糖水平的不稳定,也更容易患上二型糖尿病或者胰腺炎。

有的朋友就要问了,欧阳老师(不要脸🤪),那哪些是高 GI 值的食物哪些是低 GI 值的食物呢?

实际上,通过之前的描述,判断一种食物是高 GI 还是低 GI 其实已经很容易了。简单地说,越精加工的食物,GI 值越高,尤其是配料表中的「糖类三剑客」,白砂糖、果葡糖浆和玉米糖浆,以及富含这些糖类的食物比如汽水、果汁和各种饮料。它们不仅 GI 值高,而且因为各种添加剂的关系,对人体伤害非常大。而相对应的,粗粮、瘦肉等未经过精加工的食物一般就是低 GI 值的食物了。数据党可以参考 60 这个值,一般 GI 高于 60 就属于高 GI 食物了。

但是,我要说但是了,凡事都有例外,高 GI 也不一定就代表说这种食物不健康,比如胡萝卜和玉米,低 GI 值的也有比如士力架或者巧克力豆这种实际热量爆炸的食物。另外,运动健身后应该多补充高 GI 值的食物,以帮助身体更好地进行恢复。

WeChat QRCode