• Vol.0/ 春天来了,阳光来了

    | /

    关于定时更新

    定时更新是一个新的栏目,每月更新一次,谈谈我自己这个月所见所想。因为也有太久太久时间不写博客了,再捡起来感觉需要一些新的计划,于是打算以月更的模式写一写。可能不会太有趣,但我会尽量真实和诚恳地记录下我的想法。

    春天来了,阳光来了

    加州的冬天是有那么点阴雨连绵的,虽然整体比其他地方好不少,但有时也确实会觉得有点寒意。到了三月开始阳光明媚了起来,空气里充满着能量的气息,经过了好几个月的时不时的阴天下雨,竟然觉得有一些不适应。要是论我自己更喜欢雨天还是晴天的话,我可能是更喜欢下雨天的。下雨天我能睡得好一些,雨后的味道我也喜欢,湿漉漉的,有青草的味道,空气里悬浮着更沉着的波动。唯一觉得雨天不好的事不够亮堂,感觉心情也不会敞亮,总觉得在什么沟里来回翻滚。

  • 《只是孩子》书摘

    | /

    6

    • “你永远也当不成女招待,”她说,“不过无论如何我会支持你。”这就是她表示支持的方式。

    • 我没有偷走那本画册,而是把她的样子印在了心里。

    只是孩子

    • 我明白,在这一小段时空里,我们交付了彼此的孤独,又用信任填补了它。
  • 《人类大瘟疫》读后感及书摘

    | /

    读后感:变与不变

    一本充满着人文关怀的科普类书籍。比起详细讲述疫情的原理,更多的是讲述已知的起因与经过,以及造成的后果。涉猎范围也算是比较广,基本上涵盖了过去一百年中知名的疫情。

    作为一个90后、中国人,最熟悉的是艾滋病和SARS。特别是看艾滋病章节时,我几次几乎就要落泪。对“未知的未知”,对危险群体的画像引起的歧视与伤害,也是对隐忍而强大的病毒,我都充满深深的恐惧。我们现在已经知道了这道题的答案,我却依旧感到如此的恐惧,疫情发生时人们的恐惧应该远远在我之上。

    人类的医学技术不停发展。人们已知的病原体越来越多,检出病原体的方式方法越来越多,检出病原体所需的时间也越来越短。科学家们为此付出了巨大的心血和代价。把“未知的未知”变为“已知的未知”是一道永远不会被写完的开放题,而各个领域的专家在携手让更多未知变为已知,来抵抗下一次疫情的风险。慈善家们为疾病投入资金,世界银行也设立了疫情的基金。我们好像离一个没有疾病的美好未来越来越近了。

  • Klib - macOS上的读书笔记管理工具

    | /

    软件名:Klib

    软件官网:http://klib.me/

    我如何使用 Klib

    我认为 Klib 应该是当之无愧的 macOS 读书笔记整理 #1。我使用它来导入 Kindle 和微信读书中的书摘和读书笔记,并导出为 Markdown 格式发表于本博客。这其中 Klib 的帮助非常之大。
    对于 Kindle 而言,物理连接(USB)是其他软件也支持的选项,此外还支持除中国区外的云笔记导入,于我这样的 Kindle 中国区用户来说,USB 导入已经足够优秀。对于微信读书而言,它的体验应该是独一无二的,你只需要扫面二维码登陆网页版,便可以同步全部书籍的笔记。除此之外,Klib 还支持 Apple Book 以及多看,我认为称之为 macOS 最强读书笔记导入软件没有任何问题。

  • 《我要快乐,不必正常》书摘

    | /

    一 错误的婴儿床

    • 写作时我们展示故事,同样传达沉默。文字是沉默中能说出来的部分。

    二 给所有人的忠告:诞生

    • 她的确丢失了东西。还是件重要的东西。她已经或正在丢失生活。

    四 书的麻烦……

    • 在心理治疗中,治疗师扮演了容器的角色,收纳我们不敢释放的情绪,因为它太可怕,也收纳那些偶尔溜出来损毁我们生活的情绪。

    • 这告诉我,追求快乐,也可以说是生活本身,充满令人惊异的短期元素——我们来到原本到不了的地方,在旅程中获益,但我们不能留在那里,那不是我们的世界,我们不该让那个世界崩塌,撞毁我们可以居留的世界。

    • 实际上,机会不止两次——还有许多。五十年后的今天,我已明白,寻获与丧失、遗忘与记忆、离去与归来从未停止。生命的全部即关乎再一次机会,我们有生之日,直到最后一刻,永远都有再一次的机会。

    • 书扔完了以后,她提起我们用来暖浴室的小煤油炉,走进院子,把煤油倒在书上,点起火。 我看着它们熊熊燃烧,我现在还记得当时我心想,多么温暖,多么光明,在这个凛冽祥和的一月夜晚。而书一直以来于我都是光明与温暖。

  • 《女性的时刻》书摘

    | /

    寻找被忽略的重点

    • 你如果不为自己的生活做主,别人就会替你代劳。

    被我忽略的重点:对女性进行投资

    • 无论出于什么样的初衷,女性一旦掌握信息、工具和资金,并意识到自身的力量,就会一跃而起,带动团队实现目标。

    第二章 为母亲注入力量 产妇与新生儿健康

    • 生活中有许多事明明应该归功于年轻人或者女性,但功劳往往被年长的男性占去了。这不公平,但这就是现实。

    理解既有的文化

    • 什么是“落地”?落地就是把必需的工具交到人们手中,并鼓励他们善加使用。落地非常重要,但往往也十分复杂,需要克服贫困、距离、愚昧、质疑、羞耻感、宗教信仰和性别偏见等重重障碍。落地意味着倾听人们的心声,理解他们的需求、行为与信仰,看清他们面临的阻碍。

    村村都有助产士

    • 挽救生命的第一步,是接纳每一个人。健康的社会没有局外人。
  • 《打开:周濂的100堂西方哲学课》书摘

    | /

    序言 让我们一起来一场思想的探险

    • 学习哲学的目的是要恢复你好奇的本性,拓展你的人生广度,增加你的人生深度,学会与人类思想史上最伟大、最聪明的头脑进行直接的对话。

    • 我们不试图把所有人都纳入自己的道路上,我们只希望能更有效地与他们沟通、交流,分享同和异。

    001 导论一:哲学是什么?

    • 接受了错误教育的人比没有接受过教育的人的三观更可怕。

    • 没有标准答案的问题才是最迷人的问题

  • 《枪炮、病菌与钢铁:人类社会的命运》书摘

    | /

    前言 耶利的问题

    • 对本书来说,这样的一句话就是:“不同民族的历史遵循不同的道路前进,其原因是民族环境的差异,而不是民族自身在生物学上的差异。”

    • 在我完成了这本书之后,我认识到无论是史前时代还是现代,民族之间的接触产生了同样的问题。

    • 然而,我希望我已经使读者相信,历史并不“就是一个又一个讨厌的事实”,就像一个愤世嫉俗者说的那样。的确存在着适用于历史的广泛模式,而寻找对这些模式的解释不但令人陶醉,也是大有裨益的。

    第五章 历史上的穷与富

    • 有些地区的粮食生产完全是独立出现的,在其他地区的任何作物或动物来到之前,许多本土作物(在有些情况下还有动物)就已驯化了。
      • 原来有些文明是自然的馈赠
  • [LeetCode] 179. Largest Number

    | /

    题目

    Given a list of non negative integers, arrange them such that they form the largest number.

    Example 1:

    1
    2
    Input: [10,2]
    Output: "210"

    Example 2:

    1
    2
    Input: [3,30,34,5,9]
    Output: "9534330"

    Note: The result may be very large, so you need to return a string instead of an integer.

    解题报告

    首先,这是一个贪心问题,也就是说如果数字 a 和数字 b 比较 a 应该放在前面,那么整个字符串中 a 一定是会在 b 之前的;如果 a 比 b 前,b 比 c 前,a 一定会在 c 前面。这一点容易想到但是难以证明,因为这种比较相对于单纯比大小来说有违常理,但是存在规律。它和比较大小不同的是,比较大小先比较位数、再比较每一位大小;而这种比较大小的方式是可传递的。(为什么呢?因为是贪心,最好是证明哦~)

    其次就是写程序的问题。众所周知大部分编程语言都可以给排序函数传入一个比较函数,比较任意两个元素的大小。由于这题的所有元素是完全可以排序的,我们只要比较两个字符串拼在一起的后数字大小就可以啦!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from functools import cmp_to_key

    def scmp(a, b):
    return int(b+a) - int(a+b)

    class Solution:
    def largestNumber(self, nums):
    """
    :type nums: List[int]
    :rtype: str
    """
    nums = [*map(str, nums)]
    nums = sorted(nums, key=cmp_to_key(scmp))
    return str(int(''.join(nums)))
  • [LeetCode] 98. Validate Binary Search Tree

    | /

    题目

    Given a binary tree, determine if it is a valid binary search tree (BST).

    Assume a BST is defined as follows:

    • The left subtree of a node contains only nodes with keys less than the node’s key.
    • The right subtree of a node contains only nodes with keys greater than the node’s key.
    • Both the left and right subtrees must also be binary search trees.

    Example 1:

    1
    2
    3
    4
    5
    Input:
    2
    / \
    1 3
    Output: true

    Example 2:

    1
    2
    3
    4
    5
    6
    7
    8
        5
    / \
    1 4
    / \
    3 6
    Output: false
    Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value
    is 5 but its right child's value is 4.

    解题报告

    这题主要考查的是二叉搜索树的性质,也就是对于每一个节点来说,它左子树的所有元素都小于它,而右子树的所有元素都大于它。也就是说二叉搜索树在本题中不允许出现两个节点值相同的情况。

    方法一:前序遍历检查是否满足顺序

    二叉搜索树的一个重要特征是,它的前序遍历是符合大小顺序的,因为前序遍历用的是左中右的顺序,这应该就很好理解啦。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Solution:
    def isValidBST(self, root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    self.traverse = []
    self.dfs(root)
    return all(a < b for a, b in zip(self.traverse, self.traverse[1:]))

    def dfs(self, node):
    if not node:
    return
    self.dfs(node.left)
    self.traverse.append(node.val)
    self.dfs(node.right)

    方法二:另一种利用性质的递归

    另一种方法来自于 Leet Code 的讨论区。这种方法的中心思想利用的是节点大小的传递性:对于每个节点来说,它的左子节点的最大值是这个节点的值,而最小值维持和这个节点的最小值相同,右子节点同理。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # Definition for a binary tree node.
    # class TreeNode:
    # def __init__(self, x):
    # self.val = x
    # self.left = None
    # self.right = None

    def check_node(node, l, r):
    if not node:
    return True
    return l < node.val and node.val < r and check_node(node.left, l, node.val) and check_node(node.right, node.val, r)

    class Solution:
    def isValidBST(self, root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    l, r = float("-inf"), float("inf")
    return check_node(root, l, r)