LeetCode - 1720. Decode XORed Array
在算法世界中,数据的编码与解码问题常常需要我们深入理解数据背后的运算逻辑。LeetCode 第 1720 题 Decode XORed Array 便是这样一道围绕异或(XOR)运算展开的解码题目。它不仅考察我们对异或运算特性的掌握,还检验如何通过编码后的数组与已知条件还原出原始数组。接下来,我们就深入剖析这道题目的解题思路与实现方法。
1. 题目详细解读
题目设定了一个未知的整数数组 arr
,它由 n
个非负整数组成。经过编码后,这个数组变成了长度为 n - 1
的 encoded
数组,编码规则为 encoded[i] = arr[i] XOR arr[i + 1]
。也就是说,encoded
数组中的每个元素,都是原数组 arr
中相邻两个元素异或运算的结果。例如,当 arr = [1, 0, 2, 1]
时,经过编码得到 encoded = [1, 2, 3]
,其中 1 = 1 XOR 0
,2 = 0 XOR 2
,3 = 2 XOR 1
。
题目给定编码后的数组 encoded
和原数组 arr
的第一个元素 first
(即 arr[0]
),要求我们解码并返回原始数组 arr
。并且可以证明,在给定条件下,答案是存在且唯一的。
2. 核心解题思路
解决本题的关键在于灵活运用异或运算的特性。异或运算有一个重要性质:若 a ^ b = c
,那么 b = c ^ a
。基于这个特性,我们可以通过已知的 encoded
数组和 first
,逐步推导出原数组 arr
的每个元素。具体解题步骤如下:
- a. 初始化结果数组:将
first
作为原数组arr
的第一个元素,存入结果数组中。 - b. 遍历
encoded
数组:依次取出encoded
数组中的元素,结合已确定的原数组元素,利用异或运算的性质计算出原数组的下一个元素,并添加到结果数组中。
3. JavaScript 代码实现与解析
/**
* @param {number[]} encoded
* @param {number} first
* @return {number[]}
*/
var decode = function (encoded, first) {
let arr = [first];
let i = 0;
for (let c of encoded) {
arr[i + 1] = c ^ arr[i];
i++;
}
return arr;
};
在这段 JavaScript 代码中:
- 首先,创建一个新数组
arr
,并将first
作为数组的第一个元素存入,这就是原数组arr
的第一个元素。 - 然后,通过
for...of
循环遍历encoded
数组,每次取出一个元素c
。在循环体中,利用异或运算的性质arr[i + 1] = c ^ arr[i]
,计算出原数组arr
的下一个元素,并将其存入arr
数组的对应位置。这里的i
用于记录当前计算出的原数组元素的索引,每计算出一个元素,i
自增1
。 - 当遍历完整个
encoded
数组后,arr
数组中存储的就是解码后的原数组,最后将其返回。
4. Python 代码实现与解析
class Solution:
def decode(self, encoded, first: int):
arr = [first]
i = 0
for c in encoded:
arr.append(c ^ arr[i])
i = i + 1
return arr
Python 代码的实现逻辑与 JavaScript 一致:
- 先创建一个列表
arr
,并将first
作为列表的第一个元素,即原数组的首元素。 - 接着,通过
for
循环遍历encoded
列表,每次取出一个元素c
。在循环体中,根据异或运算的特性,计算出原数组的下一个元素c ^ arr[i]
,并将其添加到arr
列表中。同时,将索引i
加1
,以便下一次计算时使用正确的已确定元素。 - 循环结束后,
arr
列表中存储的就是解码后的原数组,最后将其返回。
5. 复杂度分析
-
时间复杂度:无论是 JavaScript 还是 Python 代码,都只对
encoded
数组进行了一次遍历。假设encoded
数组的长度为n
,那么遍历的时间复杂度为O(n)
。在遍历过程中,每次进行异或运算和数组元素的添加操作,时间复杂度都为常数级。因此,整体时间复杂度为O(n)
。 -
空间复杂度:算法创建了一个用于存储解码后原数组的数组
arr
,其长度比encoded
数组多1
。在最坏情况下,这个数组的长度与输入规模呈线性关系,所以空间复杂度为O(n)
。
6. 总结
通过对 LeetCode 1720 题的深入分析与 JavaScript、Python 两种语言的代码实现,我们成功掌握了利用异或运算特性解码数组的方法。异或运算的独特性质在这道题中发挥了关键作用,让我们能够根据编码规则和已知条件还原出原始数据。虽然两种语言的实现方式略有不同,但核心逻辑都是基于异或运算的特性进行数组元素的推导。在面对类似的数据解码问题时,深入理解运算规则并灵活运用其特性,往往是解题的突破口。如果你对本题的代码优化、其他解法有想法,或者在算法学习过程中遇到类似问题,欢迎在评论区交流探讨,一起提升算法解题能力!
这篇博客全面呈现了 LeetCode 1720 题的解题过程。若你觉得内容的表述风格、示例数量等方面需要调整,或有其他修改需求,随时和我说。