2295-替换数组中的元素

Raphael Liu Lv10

给你一个下标从 0 开始的数组 nums ,它包含 n互不相同 的正整数。请你对这个数组执行 m 个操作,在第 i
个操作中,你需要将数字 operations[i][0] 替换成 operations[i][1]

题目保证在第 i 个操作中:

  • operations[i][0]nums 中存在。
  • operations[i][1]nums 中不存在。

请你返回执行完所有操作后的数组。

示例 1:

**输入:** nums = [1,2,4,6], operations = [[1,3],[4,7],[6,1]]
**输出:** [3,2,7,1]
**解释:** 我们对 nums 执行以下操作:
- 将数字 1 替换为 3 。nums 变为 [ _ **3**_ ,2,4,6] 。
- 将数字 4 替换为 7 。nums 变为 [3,2, _ **7**_ ,6] 。
- 将数字 6 替换为 1 。nums 变为 [3,2,7, _ **1**_ ] 。
返回最终数组 [3,2,7,1] 。

示例 2:

**输入:** nums = [1,2], operations = [[1,3],[2,1],[3,2]]
**输出:** [2,1]
**解释:** 我们对 nums 执行以下操作:
- 将数字 1 替换为 3 。nums 变为 [ _ **3**_ ,2] 。
- 将数字 2 替换为 1 。nums 变为 [3, _ **1**_ ] 。
- 将数字 3 替换为 2 。nums 变为 [ _ **2**_ ,1] 。
返回最终数组 [2,1] 。

提示:

  • n == nums.length
  • m == operations.length
  • 1 <= n, m <= 105
  • nums 中所有数字 互不相同
  • operations[i].length == 2
  • 1 <= nums[i], operations[i][0], operations[i][1] <= 106
  • 在执行第 i 个操作时,operations[i][0]nums 中存在。
  • 在执行第 i 个操作时,operations[i][1]nums 中不存在。

Problem: 2295. 替换数组中的元素

[TOC]

思路

  • 首先我们使用所有的操作项,创建第一个哈希表用于合并操作,它的 key 表示被变化的值 to,val 表示变化的值 from。什么意思呢?假设我们之前的操作项是 1 变成 2 ,在我们的哈希中就记录为 key 为 2 ,val 为 1 ,表示 2 是从 1 变过来的,接下来我们遇到操作项为 2 变到 3 ,那我们就找数组中是否存在之前被变化成 2 的值,即 map.get(from),其为 1 ,若存在就重新建立映射, key 为新的值 3 ,val 为 1,这两次操作就被合并了,表示这两次操作之后,1 会变成 3。又因为每次操作,from 都会变成 to,数组中不会存在 from 这个值 ,因此每次删掉 from 这个 key 值。
  • 然后创建完成之后,因为 from 和 to 我们之前是用 key 和 val 反着记录的,因此我们可以重新创建一个哈希,将它正过来记录。方便最后直接映射返回。

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/**
* @param {number[]} nums
* @param {number[][]} operations
* @return {number[]}
*/
var arrayChange = function(nums, operations) {
const map = new Map()
for (let [from, to] of operations) {
map.set(to, map.get(from) || from)
map.delete(from)
}
const map2 = new Map()
for (let [to, from] of map) {
map2.set(from, to)
}
return nums.map(num => map2.get(num) || num)
};
 Comments
On this page
2295-替换数组中的元素