ARTS 第 24 周

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


Contents:


Algorithm

283. Move Zeroes

题目:283. Move Zeroes

难度:Easy

题意:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

解法:

本题的思路非常的直接,但也很巧妙。大体上是,使用两个指针,其中一个 i 指针遍历整个数组,碰到一个不是 0 的元素就将它赋予当前的 pos 指针,然后 pos 指针加一,当遍历完成之后,整个数组的前 pos 位就自然而然的是相对位置没有变化的元素了,再将数组的第 pos 位到最后全部置为 0 即可。

代码:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        pos = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[pos] = nums[i]
                pos += 1

        for i in range(pos, len(nums)):
            nums[i] = 0

Review

What does it take to be an expert at Python

这周 review 的不是文章,是 YouTube 上 PyData 的一个视频,这个视频是 James Powell 在 2017 年 PyData Seattle 的 talk,讲述了他对如何成为 Python 高手的理解。视频比较长,有网友根据视频内容做了一个配套的 notebook,放到了这个 github 页面上。

James Powell 大致讲述了以下几个方面,以及如何使用这些 Python 的特性来方便日常的生活。

虽然 James Powell 的语速比较快,但是吐字清晰,配上现场敲出的代码,听明白他的意思并不难,但真正理解并应用他所说的,还有不少功课要做。建议反复观看,仔细理解。

B 站链接:这里


Tips

一个 vim 配色神器

发现一个 all-in-one 的 vim 配色神器:https://github.com/flazz/vim-colorschemes

使用 :colorscheme {colorschemename} 可以改变当前配色,若需要永久使用指定配色需要将其写入 vimrc 中。


Share

Vim 中的「宏」(Macro)

不知道有没有人和我一样,第一眼看到「宏」这个词,就想起来小时候玩 Word 或者 Excel 的时候时不时蹦出来的「没有这个宏」之类的提示。。。

下面我们来说说「宏」。首先我们从一个问题入手。工作当中一个很典型的场景是,现在我们写了一个爬虫,将一堆网页的 url 爬取下来了,但是发现之后在使用这些 url 的时候,需要两边添加引号 '。就比如下面这种,你会怎么做呢?

https://www.zhihu.com/question/332265335
https://www.zhihu.com/question/23392154
https://www.zhihu.com/question/345698784
https://www.zhihu.com/question/292450646
https://www.zhihu.com/question/20058733
https://www.zhihu.com/question/36671668

有的人可能会说,就这么点儿,我就手动加就行了。这种方式在行数比较少的时候绝对可行,但是经常我们需要处理上百行几千行的数据,这时候手动添加绝对是笨办法。

还有人可能会说,我写个脚本,读取每一行处理完之后再写回原文件也可以。实际上这样做是可行的,而且很多时候我们也会倾向使用这种方式。但在我们现在这种情况下,vim 提供了一个更为简便的处理方式,就是「宏」。

Vim 中所谓的「宏」,就是一系列操作的集合,可以将这些特定的操作记录下来,然后应用到其他文本处理中去。使用「宏」的方式如下:

比如针对上面的情况,我们可以首先按下 q 开始录制宏,再按下 a 表示将这个宏保存到名为 a 的寄存器中。再针对第一行,按下 I(大写 i)表示在本行最前端插入,再按 ' 插入引号,之后按 Esc 回到 normal 模式,按下 A(大写 a)表示在本行末尾插入,再按 ' 插入引号,之后按 Esc 回到 normal 模式。这样我们就完成了宏的录制。

之后我们使用 V(大写的 v)选中需要更改的行,按下冒号 : 进入命令模式,这时候 vim 会默认有 '<'> 这样的命令,不用管它,在其之后输入 normal 表示我们这个宏是在 normal 模式下运行,再接着输入 @a 表示回放放在名称为 a 寄存器中的宏。这样我们就完成了宏的回放。所有 url 的两端也被添加上了引号。