加载中...
1313-解压缩编码列表(Decompress Run-Length Encoded List)
发表于:2021-12-03 | 分类: 简单
字数统计: 389 | 阅读时长: 1分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/decompress-run-length-encoded-list

英文原文

We are given a list nums of integers representing a list compressed with run-length encoding.

Consider each adjacent pair of elements [freq, val] = [nums[2*i], nums[2*i+1]] (with i >= 0).  For each such pair, there are freq elements with value val concatenated in a sublist. Concatenate all the sublists from left to right to generate the decompressed list.

Return the decompressed list.

 

Example 1:

Input: nums = [1,2,3,4]
Output: [2,4,4,4]
Explanation: The first pair [1,2] means we have freq = 1 and val = 2 so we generate the array [2].
The second pair [3,4] means we have freq = 3 and val = 4 so we generate [4,4,4].
At the end the concatenation [2] + [4,4,4] is [2,4,4,4].

Example 2:

Input: nums = [1,1,2,3]
Output: [1,3,3]

 

Constraints:

  • 2 <= nums.length <= 100
  • nums.length % 2 == 0
  • 1 <= nums[i] <= 100

中文题目

给你一个以行程长度编码压缩的整数列表 nums 。

考虑每对相邻的两个元素 [freq, val] = [nums[2*i], nums[2*i+1]] (其中 i >= 0 ),每一对都表示解压后子列表中有 freq 个值为 val 的元素,你需要从左到右连接所有子列表以生成解压后的列表。

请你返回解压后的列表。

 

示例 1:

输入:nums = [1,2,3,4]
输出:[2,4,4,4]
解释:第一对 [1,2] 代表着 2 的出现频次为 1,所以生成数组 [2]。
第二对 [3,4] 代表着 4 的出现频次为 3,所以生成数组 [4,4,4]。
最后将它们串联到一起 [2] + [4,4,4] = [2,4,4,4]。

示例 2:

输入:nums = [1,1,2,3]
输出:[1,3,3]

 

提示:

  • 2 <= nums.length <= 100
  • nums.length % 2 == 0
  • 1 <= nums[i] <= 100

通过代码

高赞题解

分开两列表法

  • 最推荐这个做法
  • 思路是,将奇数和偶数位置的数分开成两个列表
  • nums[::2] 是反复次数,nums[1::2]是要出现的数
  • 包装在一起,提取出每个数和其对应的出现次数
  • for i,j in zip(nums[1::2],nums[::2])
  • 显示这个数,并且反复相应的次数
  • [i for i,j in zip(nums[1::2],nums[::2]) for _ in range(j)]
  • 完整代码如下
    class Solution:
        def decompressRLElist(self, nums: List[int]) -> List[int]:
            return [i for i,j in zip(nums[1::2],nums[::2]) for _ in range(j)]

使用两个for循环法

  • 这个方法,我们先从简单开始构建。
  • 先考虑使用列表生成式写出一个原列表
  • [i for i in nums]
  • 接着考虑保留那些奇数位置的
  • [nums[i] for i in range(len(nums)) if i % 2 == 1]
  • 最后考虑让这些奇数位置的数反复偶数位置的次数
  • [nums[i] for i in range(len(nums)) for j in range(nums[i-1]) if i % 2 == 1]
  • 完整代码如下
    class Solution:
        def decompressRLElist(self, nums: List[int]) -> List[int]:
            return [nums[i] for i in range(len(nums)) for j in range(nums[i-1]) if i % 2 == 1]

花样sum法

  • 参考评论区的代码
  • 首先像第一种解法一样提取每个数和它的出现次数
  • for i,j in zip(nums[1::2],nums[::2])
  • 然后将每个出现的数和它的重复次数组成一个列表(其实是列表生成式)
  • ([b] * a for a, b in zip(nums[::2], nums[1::2]))
  • 将这个列表生成式(生成出来的列表类似于[[1,1,1],[2,2,2]])与一个空列表求和,可以将原二级嵌套列表展开
  • sum(([b] * a for a, b in zip(nums[::2], nums[1::2])), [])
  • 完整代码如下:
    class Solution:
        def decompressRLElist(self, nums: List[int]) -> List[int]:
            return sum(([b] * a for a, b in zip(nums[::2], nums[1::2])), [])

统计信息

通过次数 提交次数 AC比率
35663 42827 83.3%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1140-石子游戏 II(Stone Game II)
下一篇:
1314-矩阵区域和(Matrix Block Sum)
本文目录
本文目录