# 题目

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。

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

```  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]```

# 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

# 说明

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

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

# 打开文件

`vim life.md`

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

# Vim模式的基础

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

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

# 基本光标运动

• 绝对编号模式是正常的：每行按顺序具有唯一编号。
• 相对编号模式显示当前编辑行以外的行数。

# 说明

• 如何使用Xcode的Test导航器来测试应用程序的模型和异步方法
• 如何使用存根和模拟来伪造与库或系统对象的交互
• 如何测试UI和性能
• 如何使用代码覆盖率工具

## 找出要测试的内容

• 核心功能：模型类和方法及其与控制器的交互
• 最常见的UI工作流程
• 边界条件
• Bug修复

## 测试最佳实践

• Fast快速：测试应该快速进行。
• Independent/Isolated独立/隔离：测试不应相互共享状态。
• Repeatable可重复：每次运行测试时，您都应获得相同的结果。外部数据提供者或并发问题可能会导致间歇性故障。
• Self-validating自验证：测试应完全自动化。输出应该是“通过”或“失败”，而不是依赖于程序员对日志文件的解释。
• Timely及时：理想情况下，应该在编写要测试的生产代码之前编写测试（测试驱动开发）。

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

2020-10-14

2020-10-14

2020-10-14

2020-10-14

2020-10-14

2020-10-14