首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
Input: head = [[1,1],[2,1]]Output: [[1,1],[2,1]]

Example 3:

代码语言:javascript
复制
Input: head = [[3,null],[3,0],[3,null]]Output: [[3,null],[3,0],[3,null]]

Example 4:

代码语言:javascript
复制
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]

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

代码语言:javascript
复制

  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)

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

代码语言:javascript
复制

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,请在“终端”窗口中键入:

代码语言:javascript
复制
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原则将使您的测试清晰且有用,而不是成为您应用程序的障碍。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/3adba469228a9c8550975dbf2
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券