题图:尼斯蓬切茨公共海滩,photo by me

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

题图:尼斯蓬切茨公共海滩,photo by me

Contents

Algorithm

206. Reverse Linked List & 92. Reverse Linked List II

题目:206. Reverse Linked List

难度:Easy

题意:Reverse a singly linked list.

示例:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

解法:

使用递归方法,先来看代码。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None or head.next is None:
            return head
        last = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return last

分析递归代码,不要跳进递归里,而应该根据函数定义来弄清楚这段代码产生的结果。

逐行分析这段代码:

这样就反转了整个链表。我们接下来看第二道题。

题目:92. Reverse Linked List II

难度:Medium

题意:

Reverse a linked list from position m to n. Do it in one-pass.

Note: 1 ≤ m ≤ n ≤ length of list.

示例:

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

解法:

对于这一题,我们先来设想一个反转前 n 个元素的函数 reverseN(head, n)。它可以反转链表的前 n 个元素,并返回第 n 个元素的节点:

def reverseN(head: ListNode, n: int) -> ListNode:
    if n == 1:
        return head
    
    last = reverseN(head.next, n-1)
    successor = head.next.next

    head.next.next = head
    head.next = successor
    return last

分析一下这段代码:

最后回到这道题本身,如果 m == 1,那么就相当于从头开始反转 n 个元素;如果 m != 1,那么对于 head.next 来说就是反转 m - 1 个元素,以此类推,我们可以递归地调用这段代码本身……

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    successor = None
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        def reverseN(head: ListNode, n: int) -> ListNode:
            if n == 1:
                return head
            
            last = reverseN(head.next, n-1)
            successor = head.next.next

            head.next.next = head
            head.next = successor
            return last
        
        if head is None or head.next is None:
            return head

        if m == 1: return reverseN(head, n)
        
        head.next = self.reverseBetween(head.next, m - 1, n - 1)
        return head

Review

Rank and File - What if my note-taking system could think for me?

本周阅读的文章来自 DailyIO 的推荐,来自 Real Life 杂志的《Rank and File - What if my note-taking system could think for me?》。作者在这篇文章中,回顾了他从大学时代开始使用笔记工具的历程,他没有使用很多不同种类的工具,但尝试了多种思路之后,作者最后的发现是:

I had misplaced the focus and meaning of intellectual activity onto the act of taking notes, like someone deciding that the point of eating was the gurgling metabolic activity of their stomach rather than either the taste of food or the effect of nutrition.

包括笔记工具在内的任何工具都不应该是做事的目的。

Tips

使用简悦 + Notion 剪藏网页的任意部分

Notion 提供了浏览器的插件,来帮助我们实现对网页的收藏功能,这个功能其实蛮好用的,但缺点在于,Notion 的插件默认爬取的是网页中的第一大段,一个简单的例子就是在论坛里,Notion 只能爬取一楼的内容,无法指定获取想要的楼层。

简悦的阅读模式可以克服这个问题,只需要在使用简悦生成阅读页面时选择想要保存的部分,再从简悦提供的动作中选择「保存到 Notion」即可。

Share

郝海龙老师的时间记录方法实践记录

在《把时间当作朋友》中,李笑来记述了他自己、李敖和柳比歇夫的时间记录方式以及它们的不同,我随即也认识到时间记录的重要性。

记录时间的好处有下面几点:

  1. 记录的结果可以用来复盘;
  2. 记录的过程可以锻炼对时间的感知能力;
  3. 记录的习惯会让自己更加珍惜时间;
  4. 我们现在非常容易被大量的推送和热搜占据注意力,「记录时间」这件事本身就能让自己更加关注身边发生的事情,从而将自己抽离出来,随时校正自己行动的方向。

但是最大的问题在于,人们即便意识到了记录时间的好处,也不愿意去记录时间。我不知道我的读者中有多少人有记账的习惯,但是不愿意记录时间的原因我们可以类比一下记账:

  1. 记账本身是一件特别麻烦的事,要求即时记录与定期回顾(对账),更好的习惯还有做预算,如果没有趁手合适的工具,人们是很难保持记账这样的习惯的;
  2. 记录时间也有和记账同样的两个属性,即时记录与定期回顾(还有对应「做预算」的「做计划」的更好的习惯),只要具备这两个属性,这件事情本身就是很难做的。

由于自己从大概一年前开始就有记账的习惯,并且保持了下来,在思考了自己在记账前做的几项准备之后,我发现了以下几点:

  1. 我的账本有大小分类,还有多种标签,因此在记账时我就不用纠结这项支出属于什么类别,而可以很快速地记下几笔;
  2. 我的账本分类不重复也不缺失,及本涵盖了我生活支出的方方面面,分类之间没有冲突;
  3. 我使用的记账应用可以很方便地进行对账和预算,我可以很方便地掌控自己的收支情况。

基于此,我很快在少数派上找到了一篇和我的记账思路非常类似的记录时间的文章《郝海龙:走出时间记录的盲区》,文章中提到了几点:

从 2 月 3 日开始尝试记录自己的时间,几天之后,记录在案的时间达到了 118 小时(5 天一共 120 小时):

Toggl 记录

从以上这一份分析中,可以发现以下几点:

  1. 我花在「居家休闲、网上冲浪、网购」这一块的时间比较多,其实是下班以后在家休息的时间,还是有点多的,之后可以再调整一下;
  2. 「个人护理及吃饭」这块,平均每天会花费两个半小时,包括洗漱打扫卫生做饭吃饭等等,最开始看到 12.6 小时我觉得是不是有点多,但算下来似乎也还好?
  3. 「影音游戏」这块,这两天在 Clubhouse 上花费了一点时间,这周和女朋友待在一块,预计这块时间应该会增多;
  4. 按照 5 天睡眠 42 小时来推算,每周的睡眠时间是够的,但睡眠质量不好,需要改进。

其他更细致的数据还需要对照每天的时间记录进行挖掘,暂时先想这么多,欢迎在评论区留言讨论~

WeChat QRCode