17

深拷贝链表,python 处理音频信号和数字信号、vim 教程、swift 单元测试和 UI 测试 Jo...

 3 years ago
source link: https://xie.infoq.cn/article/3adba469228a9c8550975dbf2
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1. Algorithm: 每周至少做一个 LeetCode 的算法题

笔者的文章:

算法:深拷贝链表,其中链表有个随机指向的指针Copy List with Random Pointer

题目

138. Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

The Linked List is represented in the input/output as a list of n nodes. Each node is represented as a pair of [val, random_index] where:

  • val: an integer representing Node.val

  • random_index: the index of the node (range from 0 to n-1) where random pointer points to, or null if it does not point to any node.

Example 1:

qYVfuyN.png!mobile

Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]

Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]

Example 2:

jmeQNv.png!mobile

Input: head = [[1,1],[2,1]]

Output: [[1,1],[2,1]]

Example 3:

AjMb6rq.png!mobile

Input: head = [[3,null],[3,0],[3,null]]

Output: [[3,null],[3,0],[3,null]]

Example 4:

Input: head = []

Output: []

Explanation: Given linked list is empty (null pointer), so return null.

Constraints:

  • -10000 <= Node.val <= 10000

  • Node.random is null or pointing to a node in the linked list.

  • The number of nodes will not exceed 1000.

思路分析

next,random都需要指向对象,那么就需要一个字典,key为对象,value为深拷贝的新对象。两次循环即可:

  1. 第一次循环组装字典,

  2. 第二次循环设置next,random。

返回结果为 dict[head]

解法一:手动复制链表到字典里面

def copyRandomList (self, head: 'Node' ) -> 'Node':

dict = {}

m = n = head

while m:

dict[m] = Node(m.val)

m = m.next

while n:

dict[n].next = dict.get(n.next)

dict[n].random = dict.get(n.random)

n = n.next

return dict.get(head)

解法二:用系统方法先深拷贝整个链表

import collections

def copyRandomListWithOneRound (self, head: 'Node' ) -> 'Node':

dic = collections.defaultdict( lambda : Node( 0 ))

dic[ None ] = None

n = head

while n:

dic[n].val = n.val

dic[n].next = dic[n.next]

dic[n].random = dic[n.random]

n = n.next

return dic[head]

2. Review: 阅读并点评至少一篇英文技术文章

PySDR: A Guide to SDR and DSP using Python

https://pysdr.org/content/intro.html

这是一篇介绍python处理音频信号和数字信号的简短教程。说的是如果不想看1000页的教程,用这个教程入门是比较方便的。

Software-Defined Radio (SDR):

A radio that uses software to perform signal-processing tasks that were traditionally performed by hardware

Digital Signal Processing (DSP):

The digital processing of signals, in our case RF signals

3. Tips: 学习至少一个技术技巧

笔者的文章:

翻译:Vim从入门到精通 Mac OS

说明

Vim是Mac随附的免费且功能强大的文本编辑器。在本教程中,我将向您展示此文本编辑器的基础知识。

Pycharm 开启vim编辑器后,tab功能不起作用,其实是用 > 来缩进。

打开文件

您可以像任何命令行编辑器一样在Vim中打开文件。

vUzUfa.png!mobile

如果要编辑的文件是life.md,请在“终端”窗口中键入:

vim life.md

Vim将在该终端中打开并加载该文件。Vim是终端程序,而不是图形系统程序。

Vim模式的基础

Vim有四种模式:Normal,Insert,Visual和Command。每种模式都在程序状态栏的左下方显示其名称。

当您启动Vim时,它处于正常模式。您可以使用所有命令键来浏览文件并开始编辑。当您退出任何其他模式时,Vim会返回到普通模式。

Vim使用a,A,i,I,o和O命令处于插入模式。进入插入模式后,编辑器将保持该模式,直到您按Esc键。每按一次其他键将直接插入文件中当前光标所在的位置。

当您在正常模式下使用v,V和Ctrl-v命令时,就会出现可视模式。在可视模式下,您可以选择文本。当您使用导航命令时,从可视模式的开始到退出可视模式的区域是选定的文本。

在正常模式下,只要使用:命令,就会进入命令模式。在命令模式下,您可以执行复杂的编辑功能,文件操作或外壳程序操作。命令模式是唯一一种在状态行上不显示任何内容的模式,但是输入的命令将放置在状态行下,并键入任何其他内容和光标。

保存文件并关闭Vim

在正常模式下,您可以键入ZZ保存所有内容并退出。您也可以使用:w!保存文件。。的:将你置于命令模式中,w ^将写入文件,以及!强制操作写没有问题。或者,您可以键入:wq或:wq!。该q退出编辑器。您也可以使用:q!退出而不保存。

基本光标运动

在普通模式下,您可以在文件中四处移动并对文件进行特定的编辑。该^ h键将光标移动到左边。该升键将光标移动到右侧。所述Ĵ键将光标向下移动一行,而ķ键将光标上移一行。要移至下一个单词,请使用w命令。上一个单词命令是b。

如果要一次移动多个空格,单词或行,请先键入数字,然后再输入方向键。光标将沿该方向移动该次数。例如,如果键入10j,光标将向下移动10行。

通过使用命令模式,您可以将行号切换为绝对或相对:

  • 绝对编号模式是正常的:每行按顺序具有唯一编号。

  • 相对编号模式显示当前编辑行以外的行数。

uaEvi2J.png!mobile

要使用绝对行编号,可以使用:set number命令。要不显示行号,请使用:set nonumber命令。

Rbmq2ay.png!mobile

要设置相对编号,请输入:set relativenumber。要将其放回绝对编号,请输入:set norelativenumber。

b6ZZbuU.png!mobile

通过使用:set number和:set relativenumber设置两种模式,Vim将显示当前行以外的所有行的相对编号。当前的编辑行将显示其绝对编号。

通过使用相对编号模式,您可以使用j或k命令快速查看要移动的行数。例如,要移至List所在的行,请按2j。

要移至行首,请使用0(即零)命令。要移至行尾,请使用$命令。的GG命令将所述光标移动到文件的开头,而ģ命令将移动到文件的末尾。

4. Share: 分享一篇有观点和思考的技术文章

笔者写的博客链接

翻译:iOS Swift单元测试 从入门到精通 Unit Test和UI测试 UITest

说明

编写测试并不是魅力十足,但是由于测试可以防止您闪亮的应用程序变成臭虫缠身的垃圾,所以这是必要的。如果您正在阅读本教程,您已经知道应该为代码和UI编写测试,但是可能不知道如何做。

您可能有一个正在运行的应用程序,但是您想测试为扩展该应用程序所做的更改。也许您已经编写了测试,但是不确定它们是否是正确的测试。或者,您已经开始开发新的应用程序,并想随身进行测试。

本教程将向您展示:

  • 如何使用Xcode的Test导航器来测试应用程序的模型和异步方法

  • 如何使用存根和模拟来伪造与库或系统对象的交互

  • 如何测试UI和性能

  • 如何使用代码覆盖率工具

在此过程中,您将掌握测试忍者所使用的一些词汇。

找出要测试的内容

在编写任何测试之前,了解基础知识很重要。您需要测试什么?

如果您的目标是扩展现有应用程序,则应首先为计划更改的任何组件编写测试。

通常,测试应涵盖:

  • 核心功能:模型类和方法及其与控制器的交互

  • 最常见的UI工作流程

  • 边界条件

  • Bug修复

测试最佳实践

首字母缩写词FIRST描述了有效单元测试的一组简明标准。这些标准是:

  • Fast快速:测试应该快速进行。

  • Independent/Isolated独立/隔离:测试不应相互共享状态。

  • Repeatable可重复:每次运行测试时,您都应获得相同的结果。外部数据提供者或并发问题可能会导致间歇性故障。

  • Self-validating自验证:测试应完全自动化。输出应该是“通过”或“失败”,而不是依赖于程序员对日志文件的解释。

  • Timely及时:理想情况下,应该在编写要测试的生产代码之前编写测试(测试驱动开发)。

遵循FIRST原则将使您的测试清晰且有用,而不是成为您应用程序的障碍。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK