深拷贝链表,python 处理音频信号和数字信号、vim 教程、swift 单元测试和 UI 测试 John 易筋 ARTS 打卡 Week 21

用户头像
John(易筋)
关注
发布于: 2020 年 10 月 14 日

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:



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:



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

Example 3:



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中打开文件。

如果要编辑的文件是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行。



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



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

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

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

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

通过使用: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原则将使您的测试清晰且有用,而不是成为您应用程序的障碍。



发布于: 2020 年 10 月 14 日 阅读数: 374
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。开发过日活过亿的淘宝Taobao App,擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
深拷贝链表,python处理音频信号和数字信号、vim教程、swift单元测试和UI测试 John 易筋 ARTS 打卡 Week 21