题目
给你一个以行程长度编码压缩的整数列表 nums 。
考虑每相邻两个元素 [a, b] = [nums[2*i], nums[2*i+1]] (其中 i >= 0 ),每一对都表示解压后有 a 个值为 b 的元素。
请你返回解压后的列表。
示例:
1 | 输入:nums = [1,2,3,4] |
提示:
1 | 2 <= nums.length <= 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)]- 完整代码如下
1 | class Solution: |
使用两个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]- 完整代码如下
1 | class Solution: |
花样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])), []) - 完整代码如下:
1 | class Solution: |


