ARTS 第 29 周

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


Contents


Algorithm

9. Palindrome Number

题目:9. Palindrome Number

难度:Easy

题意:Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

示例 1:

Input: 121
Output: true

示例 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.

示例 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

进阶:Coud you solve it without converting the integer to a string?

解法:

本题与上周的 Reverse Integer 那一题非常像,都需要反转一个数字。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x)[::-1] == str(x)
class Solution:
    def isPalindrome(self, x: int) -> bool:
        rev = 0
        a = abs(x)

        while (a != 0):
            rev = rev * 10 + a % 10
            a = a // 10

        return True if rev == x else False

时间复杂度 O(n),空间复杂度 O(1)。


Review

The Most Underrated Productivity Technique Is Also the Simplest

本周阅读了一篇 Medium 上获得很多点赞的一篇文章,The Most Underrated Productivity Technique Is Also the Simplest。文章短小精悍,遂将其翻译如下。

人类是不可能阅读完每一条有关生产力的建议的,但我想我已经接近了。我曾经一度尝试了非常多的生产力建议,无论这些建议有多反人类。有一次我尝试了冷水浴,据说他可以帮助你抵消拖延症(而实际上并没有)。

最终,有那么一下,我忽然意识到学习这些所谓的时间管理技巧、日历系统和多步策略实际上只会让我拖延真正的工作——把事情做了。事实上,我已经知道了最有效的生产力建议,只需要把它用起来。

这个建议只有两个步骤:

  1. 身体上处于你的工作位置
  2. 做一件小事

这就是全部的建议。

这个建议很简单,但不容易做到。通常的情况是,我们会竭尽我们所能去避免第一步的发生。我们会去喝杯咖啡、散个步、读本书、办个事。在我写这篇文章之前,我已经去整理了我的书架。我尝试去逃避,而我内心的声音告诉我去打开 Netflix。

然而,我坐到书桌前,收起了手机,关掉了浏览器,开始做一件我为今天安排的小事,然后,就像魔法一样,我开始工作了。

这个技巧的真正秘密在于,你必须要在第二天和下一天以及下下一天都去实践它,建立起一个动量并保持它。作家威尔·杜兰特(Will Durant)写道:「We are what we repeatedly do. Excellence, then, is not an act, but a habit.」(我们就是我们重复做的事。然后,优秀就不是一个行为了,而是一个习惯。)

「非零日」原则是这样的:只要每天做一件能让你朝着你的目标前进的事就行了。就像 Reddit 用户 ryans01 在一篇 post 中说的:「Didn’t do anything all fucking day and it’s 11:58 PM? Write one sentence. One push up. Read one page of that chapter. One. Because one is non zero.」(一整天都没有做什么事情吗?写一个句子、做一个俯卧撑、读那一章的一页。只要做一个就好,因为一个总比零个要好。)

我们可以整日谈论最新的生产力系统,但是这样并不能帮你完成你真正的工作。你必须坐在椅子上并开始做一件小事。


Tips

推荐几个 vscode 插件

最近在折腾编辑器,由于 vscode 最近新支持了 .ipynb,这让验证算法结果又简单了一些,于是从 vim 切换到了 vscode,下面推荐几个我的插件:


Share

列表常用方法总结

概念

Python:列表(list),其他语言:数组(array)

查询(访问)

修改

通过索引赋值即可

增加

删除

其他

  1. 求长度:len(lst)
  2. 反转:reverse
  3. 排序:sort(reverse=False)
  4. 拷贝:
    1. 浅拷贝(影子拷贝)copy:
      • copy 过来的列表中,可变对象(如列表、字典、集合等)是引用传递,改变可变对象中的元素也会改变原列表中可变对象的值
      • 而不可变对象(如元组、字符串、int、float、bool 等)是值传递,改变这些不可变对象不会改变原列表
    2. 深拷贝 from copy import deepcopy:
      • 改变可变对象中的元素不会影响原列表

元组常用方法总结

定义

另一种有序列表,与 list 很像,但一旦创建便不可被修改。

tuple 没有 append、insert 这样的方法。

可以使用下标去访问元组中的元素,但不能赋值,同样支持负数下标。

tuple 因为不可变,所以比 list 更安全,如果可能,尽量使用 tuple。

元组的陷阱

定义元组的时候,如果元组中只有一个元素,那么需要在这个元组之后加上逗号 ,,否则会与数学中的小括号产生歧义。

「可变」的元组

元组中的元素本身是可变的时候,我们还是可以对其进行修改。举例:

t = ['a', 'b', [1, 2]]
t[2].append(3)
print(t) # ['a', 'b', [1, 2, 3]]