正文
ARTS 第 29 周
每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
Contents
- Algorithm: 9. Palindrome Number
- Review: The Most Underrated Productivity Technique Is Also the Simplest
- Tip: 推荐几个 vscode 插件
- Share: 列表与元组的几个常用方法总结
Algorithm
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 那一题非常像,都需要反转一个数字。
- 首先我们先尝试一下使用字符串的方式来解决这个问题。Python 中利用字符串的切片操作可以很方便地反转字符串:
class Solution:
def isPalindrome(self, x: int) -> bool:
return str(x)[::-1] == str(x)
- 我们利用上周相同的方式,对 10 取余并反向相加,最后比较最终的结果:
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。文章短小精悍,遂将其翻译如下。
人类是不可能阅读完每一条有关生产力的建议的,但我想我已经接近了。我曾经一度尝试了非常多的生产力建议,无论这些建议有多反人类。有一次我尝试了冷水浴,据说他可以帮助你抵消拖延症(而实际上并没有)。
最终,有那么一下,我忽然意识到学习这些所谓的时间管理技巧、日历系统和多步策略实际上只会让我拖延真正的工作——把事情做了。事实上,我已经知道了最有效的生产力建议,只需要把它用起来。
这个建议只有两个步骤:
- 身体上处于你的工作位置
- 做一件小事
这就是全部的建议。
这个建议很简单,但不容易做到。通常的情况是,我们会竭尽我们所能去避免第一步的发生。我们会去喝杯咖啡、散个步、读本书、办个事。在我写这篇文章之前,我已经去整理了我的书架。我尝试去逃避,而我内心的声音告诉我去打开 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,下面推荐几个我的插件:
- Vim:用惯了 vim,第一件事当然是将 vscode 的键位绑定至 vim 中的键位设置了
- Code Runner:一键运行各种脚本(甚至 Java 和 C)
- LeetCode:允许你直接在 vscode 中刷题
- koroFileHeader:一键添加/自动生成文件头部注释和函数注释
- Markdown Preview Enhannced:增强的 MD 文件预览插件,支持数学公式
- Shebang Snippets:自动插入 shebang 代码片段
Share
列表常用方法总结
概念
Python:列表(list),其他语言:数组(array)
查询(访问)
-
index:返回第一个出现的值的索引
-
count:返回值出现的次数
index 和 count 的时间复杂度是 O(n),与数据规模线性相关
修改
通过索引赋值即可
增加
-
append:原地修改,加在最后一位
-
insert:将值插入指定位置;越界的时候,不会报错,而直接插入到最左或最右
append 时间复杂度 O(1),insert 时间复杂度 O(n);尽量使用 append
-
extend:原地修改,将可迭代对象添加到列表末尾;相当于在列表末尾对新可迭代对象进行了循环的 append
extend 经常用在两个列表的相加上,但是原地修改,不会增加新的列表
-
list + list:两个列表相加,但是会返回一个新的列表
删除
-
remove:删除第一个值,如果没有,抛出异常;原地修改,无返回值
-
pop:不传入参数则默认返回并删除最后一个值,若传入参数 index,则返回并删除 index 所在位置的值;索引不存在抛出异常
remove 不传递 index 参数,O(1),返回 None;pop 传递 index 参数,O(n),返回删除的元素
-
clear:清空列表,但列表对象还存在
其他
- 求长度:len(lst)
- 反转:reverse
- 排序:sort(reverse=False)
- 拷贝:
- 浅拷贝(影子拷贝)copy:
- copy 过来的列表中,可变对象(如列表、字典、集合等)是引用传递,改变可变对象中的元素也会改变原列表中可变对象的值
- 而不可变对象(如元组、字符串、int、float、bool 等)是值传递,改变这些不可变对象不会改变原列表
- 深拷贝 from copy import deepcopy:
- 改变可变对象中的元素不会影响原列表
- 浅拷贝(影子拷贝)copy:
元组常用方法总结
定义
另一种有序列表,与 list 很像,但一旦创建便不可被修改。
tuple 没有 append、insert 这样的方法。
可以使用下标去访问元组中的元素,但不能赋值,同样支持负数下标。
tuple 因为不可变,所以比 list 更安全,如果可能,尽量使用 tuple。
元组的陷阱
定义元组的时候,如果元组中只有一个元素,那么需要在这个元组之后加上逗号 ,,否则会与数学中的小括号产生歧义。
「可变」的元组
元组中的元素本身是可变的时候,我们还是可以对其进行修改。举例:
t = ['a', 'b', [1, 2]]
t[2].append(3)
print(t) # ['a', 'b', [1, 2, 3]]