ARTS 第 38 周

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


Contents


Algorithm

21. Merge Two Sorted Lists

题目:21. Merge Two Sorted Lists

难度:Easy

题意:Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

示例:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

解法:这道题的思路其实比较直接,遍历两个链表,挨个比较两个链表中的值,将较小的那个插入到新的链表当中,最后如果某一个链表遍历完了而另一个链表还有剩余,那么就说明剩余的这个链表的所有数字都比前面的大,就将剩余的这个链表插入到新链表的结尾。最后需要注意的一点是,返回值为新链表的头结点,所以在初始化阶段需要将待操作链表节点复制给另一个节点保存起来,最后返回这个节点的下一个节点。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        curr = rtNode = ListNode(0)

        while l1 and l2:
            if l1.val < l2.val:
                curr.next = l1
                l1 = l1.next
            else:
                curr.next = l2
                l2 = l2.next
            curr = curr.next
        curr.next = l1 or l2

        return rtNode.next

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


Review

Want to Be a Good Programmer? Learn How To Write

本周阅读的文章来自 Medium 的「Better Programming」专栏,文章名为《Want to Be a Good Programmer? Learn How To Write》。本文重点在于文章开头的这句话:

Having a solid grasp of communicating via written language teaches you an important skill in programming that has nothing to do with computer science per se and everything to do with expressing ideas.

翻译过来就是:扎实地掌握通过书面语言进行交流的技巧,可以让你掌握编程方面的一项重要技能,这项技能与计算机科学本身无关,而与表达思想有关。

本文首先通过讲述「我们花更多时间来读代码而不是写代码」,表述了自己对于一个「程序」的看法:首先它是一系列机器可以执行的指令;再者它是为你代码未来的维护者所作的一篇结构化的文章。

接下来作者表示「软件开发中,软件的维护占了绝大多数成本」,并解释了这一现象的原因。

之后通过对比写作和编码,作者给出了 5 条提高代码可读性的建议:

  1. 当有更简单的选择时,不要调用大部分程序员都不熟悉的函数库或者 API;
  2. 不要使用项目维护者不熟悉或者过于有挑战性的设计模式;
  3. 简洁直接,不要有花里胡哨的语法或技巧;
  4. 通过模块和抽象,使模块尽量小并且做且仅做一件事,遵循 UNIX 中的「小、可堆叠」的概念;
  5. 代码直接体现功能,程序的结构也应是可预测的。

作者之后详细解释了「什么是可读性」、讲述了「我们为什么会忽略可读性」的原因以及表示「可读性是修改出来的」。

文章本身就是讲述可读性的,所以文章本身也不难读。另外这里插一句,建议同时阅读阮一峰老师的这篇《关于 UNIX 哲学》。


Tips

VS Code 中几个好用的编辑器设置

这周分享几个我的 VS Code 中的几个好用的编辑器设置:

关于最后一个默认文件格式补充一点,在新建一个文件之后,可以通过按下 Cmd+K+M 来快速地设置文件的格式。


Share

使用 RStudio 中的 Rmarkdown 编写演示文档

首先介绍一下 R 这个在数据分析和统计学中使用的非常广泛的一门语言:

R 是一个数据分析、统计建模和作图的软件,它包含一门计算机语言称为 R 语言,R 语言与通常的 C、C++、Java 等编程语言相比,支持更多的数据类型,如向量、矩阵,并提供了多种统计和数学计算方法。R 软件是一个开源软件,可以免费地从其网站http://www.r-project.org 提供的镜像网站下载安装。另外,RStudio 是一个 R 软件的集成开发环境(IDE),在该软件中可以更方便地使用 R 软件,虽然 RStudio 是商业软件,但非商业用户可以免费地使用。

接着是 Markdown:

Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。Markdown 的语法十分简单,常用的标记符号也不超过十个,相对于更为复杂的 HTML 来说,Markdown 可谓十分轻量,学习成本也不高,且一旦熟悉这种语法规则,则会有一劳永逸的效果。

关于 Markdown 的语法这里就不再详述,不熟悉的同学可以参考这个 B站视频。下面讲述如何使用 RStudio 以及 RMarkdown 来编写演示文档。

首先打开 RStudio,点击左上角新建文件图标,选择「RMarkdown」:

Create new file

在弹出的窗口中指定 Rmd 类型为「Presentation」:

Specify rmd type

接下来 RStudio 为你生成了一个 Rmd 文件,在文件开头的 yml 中你会发现有几个 metadata:

---
title: "Tuto"
author: "马克图布"
date: "2019/12/22"
output: ioslides_presentation
---

其中的 「title」、「author」和「date」都好理解,而「output」的内容则是 RStudio 提供的演示文稿的模板之一,RStudio 中默认提供有 ioslide、Slidy、Beamer 和 PowerPoint 这四种演示文稿模板,而 ioslide 则是我个人推荐的一个模板,对 LaTeX 公式、代码高亮以及图片和中文支持都非常好。

接下来你可以看到一些说明性的文字,教你如何创建无序列表页面、包含 R 代码以及输出的页面和图示页面。点击 Knit 图标即可生成并打开一个 HTML 格式的演示文档。这里补充一句个人经验,由于 Mac 上 RStudio 内嵌的 Webkit 渲染引擎在生成 LaTeX 公式的时候有自动进行换行的问题,所以建议点击「Open In Browser」在 Chrome 或 Firefox 中打开,这样不会有渲染问题。Safari 也不会有渲染问题,但翻页速度比较慢,不建议使用。

你可以通过以下方式创建页面:

通过插入以下代码来在 Markdown 中添加可执行的 R 代码:

Insert executable R code

看见最后的那个绿色小三角形了吗,点击就可以执行这段代码并在文件中显示输出。通过指定 messagewarningecho 的布尔值控制生成的演示文档:

通过插入 $LaTeX$(单美元符号)来在行内插入 LaTeX 公式,$$LaTeX$$(双美元符号)插入单行 LaTeX 公式,同时 RStudio 支持使用 {matrix}{align} 等 LaTeX 内置标准库对 LaTeX 公式进行更进一步的排版。

最后就是进行演示了。在浏览器中打开演示文稿,使用前后键进行翻页,你还可以通过不同的快捷键进入不同的演示模式:

到此,使用 RStudio 通过 RMarkdown 文件编写演示文稿的大部分注意事项已经总结完毕,你已经可以上手写一个简单的演示文稿了。更详细的使用说明可以参考官方文档