LeetCode - 1313. Decompress Run-Length Encoded List

LeetCode - 1313. Decompress Run-Length Encoded List

在数据处理与算法领域,数据的压缩与解压缩是常见的操作场景。LeetCode 1313. Decompress Run-Length Encoded List聚焦于对行程长度编码(Run-Length Encoding,RLE)列表的解压缩,这不仅考察对数组操作的熟练度,还检验我们将编码数据还原为原始数据的逻辑能力。接下来,我们就一同探索这道题目的解题思路与实现方法。

1. 题目详细解读

题目给定一个经过行程长度编码后的数组 nums 作为输入。在这种编码规则下,数组中每两个元素为一组,第一个元素表示第二个元素重复的次数。例如,数组 [1, 2, 3, 4] 表示数字 2 出现 1 次,数字 4 出现 3 次 。我们的任务是对这个编码数组进行解压缩,将其还原为原始的未编码数组并输出。比如,对于输入 [1, 2, 3, 4],应输出 [2, 4, 4, 4]

2. 核心解题思路

解决本题的关键在于理解编码数组的结构,并按照规则生成解码后的数组,其核心步骤如下:

  1. 遍历编码数组:以步长为 2 对编码数组进行遍历,因为每两个元素构成一组编码信息。
  2. 生成解码数据:对于每一组编码,根据第一个元素指定的次数,将第二个元素添加到结果数组中,从而实现解压缩的过程。

3. JavaScript 代码实现与解析

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var decompressRLElist = function (nums) {
    let arr = [];
    for (let i = 0; i < nums.length; i = i + 2) {
        arr.push(...(new Array(nums[i])).fill(nums[i + 1]));
    }
    return arr;
};

在这段 JavaScript 代码中:

  • 首先,初始化一个空数组 arr 用于存储解码后的结果。
  • 然后,通过 for 循环遍历编码数组 nums,循环变量 i 每次递增 2,确保每次处理一组编码数据。
  • 在循环体内部,利用 new Array(nums[i]).fill(nums[i + 1]) 创建一个长度为 nums[i],且所有元素都为 nums[i + 1] 的新数组,再使用展开运算符 ... 将这个新数组的元素直接添加到结果数组 arr 中。
  • 当遍历完整个编码数组后,arr 中存储的就是解码后的数组,最后将其返回。

4. Python 代码实现与解析

class Solution:
    def decompressRLElist(self, nums):
        arr = []
        for i in range(0, len(nums) - 1, 2):
            while nums[i]:
                arr.append(nums[i + 1])
                nums[i] = nums[i] - 1
        return arr

Python 代码的实现逻辑同样清晰:

  • 先定义一个空列表 arr 用于存放解码后的元素。
  • 通过 for 循环以步长 2 遍历编码列表 nums,循环变量 i 的取值范围是从 0len(nums) - 1,保证不越界且每次处理一组数据。
  • 在循环内部,使用 while 循环,根据当前组的第一个元素 nums[i] 的值,将第二个元素 nums[i + 1] 重复添加到结果列表 arr 中,每添加一次,nums[i] 的值减 1,直到 nums[i] 变为 0,表示该组元素添加完毕。
  • 遍历结束后,arr 即为解码后的数组,将其返回。

5. 复杂度分析

  • 时间复杂度:无论是 JavaScript 还是 Python 代码,都只对编码数组进行了一次遍历。在遍历过程中,每次处理一组数据的操作时间复杂度为常数级。假设编码数组的长度为 n,由于以步长 2 遍历,所以整体时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度:算法创建了一个用于存储解码结果的数组,其长度取决于编码数组所表示的原始数据规模。在最坏情况下,解码后的数组长度与编码数组长度呈线性关系,因此空间复杂度也为 O ( n ) O(n) O(n)

6. 总结

通过对 LeetCode 1313 题的深入分析与 JavaScript、Python 两种语言的代码实现,我们掌握了对行程长度编码列表进行解压缩的方法。尽管两种语言的实现方式略有差异,但核心思路都是基于编码规则遍历并生成解码数组。在实际编程与算法学习中,理解数据的编码规则并灵活运用数组操作是解决这类问题的关键。如果你在遇到类似的数据处理问题,或是对本题的代码优化、其他解法有想法,欢迎在评论区交流探讨,一起提升算法实践能力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿蒙Armon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值