LeetCode - 1720. Decode XORed Array

这篇博客介绍了一种解码XOR编码整数数组的方法。给定一个编码后的数组和原数组的第一个元素,通过XOR运算,可以逐步还原原始数组。解题思路是利用XOR的性质,如果a^b=c,那么b=c^a。遍历编码数组,每次根据当前XOR值和前一个元素进行异或操作,即可得到原数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode - 1720. Decode XORed Array

在算法世界中,数据的编码与解码问题常常需要我们深入理解数据背后的运算逻辑。LeetCode 第 1720 题 Decode XORed Array 便是这样一道围绕异或(XOR)运算展开的解码题目。它不仅考察我们对异或运算特性的掌握,还检验如何通过编码后的数组与已知条件还原出原始数组。接下来,我们就深入剖析这道题目的解题思路与实现方法。

1. 题目详细解读

题目设定了一个未知的整数数组 arr,它由 n 个非负整数组成。经过编码后,这个数组变成了长度为 n - 1encoded 数组,编码规则为 encoded[i] = arr[i] XOR arr[i + 1]。也就是说,encoded 数组中的每个元素,都是原数组 arr 中相邻两个元素异或运算的结果。例如,当 arr = [1, 0, 2, 1] 时,经过编码得到 encoded = [1, 2, 3],其中 1 = 1 XOR 02 = 0 XOR 23 = 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 列表中。同时,将索引 i1,以便下一次计算时使用正确的已确定元素。
  • 循环结束后,arr 列表中存储的就是解码后的原数组,最后将其返回。

5. 复杂度分析

  • 时间复杂度:无论是 JavaScript 还是 Python 代码,都只对 encoded 数组进行了一次遍历。假设 encoded 数组的长度为 n,那么遍历的时间复杂度为 O(n)。在遍历过程中,每次进行异或运算和数组元素的添加操作,时间复杂度都为常数级。因此,整体时间复杂度为 O(n)

  • 空间复杂度:算法创建了一个用于存储解码后原数组的数组 arr,其长度比 encoded 数组多 1。在最坏情况下,这个数组的长度与输入规模呈线性关系,所以空间复杂度为 O(n)

6. 总结

通过对 LeetCode 1720 题的深入分析与 JavaScript、Python 两种语言的代码实现,我们成功掌握了利用异或运算特性解码数组的方法。异或运算的独特性质在这道题中发挥了关键作用,让我们能够根据编码规则和已知条件还原出原始数据。虽然两种语言的实现方式略有不同,但核心逻辑都是基于异或运算的特性进行数组元素的推导。在面对类似的数据解码问题时,深入理解运算规则并灵活运用其特性,往往是解题的突破口。如果你对本题的代码优化、其他解法有想法,或者在算法学习过程中遇到类似问题,欢迎在评论区交流探讨,一起提升算法解题能力!

这篇博客全面呈现了 LeetCode 1720 题的解题过程。若你觉得内容的表述风格、示例数量等方面需要调整,或有其他修改需求,随时和我说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿蒙Armon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值