每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
难度: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)。
本周阅读了一篇 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.」(一整天都没有做什么事情吗?写一个句子、做一个俯卧撑、读那一章的一页。只要做一个就好,因为一个总比零个要好。)
我们可以整日谈论最新的生产力系统,但是这样并不能帮你完成你真正的工作。你必须坐在椅子上并开始做一件小事。
最近在折腾编辑器,由于 vscode 最近新支持了 .ipynb,这让验证算法结果又简单了一些,于是从 vim 切换到了 vscode,下面推荐几个我的插件:
Python:列表(list),其他语言:数组(array)
count:返回值出现的次数
index 和 count 的时间复杂度是 O(n),与数据规模线性相关
通过索引赋值即可
insert:将值插入指定位置;越界的时候,不会报错,而直接插入到最左或最右
append 时间复杂度 O(1),insert 时间复杂度 O(n);尽量使用 append
extend:原地修改,将可迭代对象添加到列表末尾;相当于在列表末尾对新可迭代对象进行了循环的 append
extend 经常用在两个列表的相加上,但是原地修改,不会增加新的列表
pop:不传入参数则默认返回并删除最后一个值,若传入参数 index,则返回并删除 index 所在位置的值;索引不存在抛出异常
remove 不传递 index 参数,O(1),返回 None;pop 传递 index 参数,O(n),返回删除的元素
另一种有序列表,与 list 很像,但一旦创建便不可被修改。
tuple 没有 append、insert 这样的方法。
可以使用下标去访问元组中的元素,但不能赋值,同样支持负数下标。
tuple 因为不可变,所以比 list 更安全,如果可能,尽量使用 tuple。
定义元组的时候,如果元组中只有一个元素,那么需要在这个元组之后加上逗号 ,
,否则会与数学中的小括号产生歧义。
元组中的元素本身是可变的时候,我们还是可以对其进行修改。举例:
t = ['a', 'b', [1, 2]]
t[2].append(3)
print(t) # ['a', 'b', [1, 2, 3]]