问题描述
小S希望将手链上相同颜色的珠子去重,只保留每种颜色最后出现的那颗珠子,同时保持珠子的原来相对顺序。问题的核心是如何通过扫描数组,确保每种颜色只保留其最后出现的那一个。
解题思路:
1. 从后扫描:
为了确保保留的是每种颜色的最后一次出现,我们可以从数组的最后一个元素开始向前扫描,这样可以保证我们遇到的第一个颜色就是该颜色的最后一次出现。
2. 记录颜色:
为了避免重复处理某种颜色,我们可以使用一个集合(set)来记录已经保留的颜色。如果某种颜色已经存在于集合中,则跳过该颜色。
3. 结果反转:
由于我们是从后往前扫描的,得到的结果顺序与题目要求的顺序相反,所以最后需要将结果反转。
代码实现:
def solution(n, a):
seen = set()
result = []
for i in range(n - 1, -1, -1):
if a[i] not in seen:
result.append(a[i])
seen.add(a[i])
return result[::-1]
代码解释:
集合 seen: 用于记录已经处理过的颜色,保证每种颜色只处理一次。
列表 result: 存储保留的颜色,初始化为空。
从后遍历数组 a: 通过 for i in range(n - 1, -1, -1),我们从数组的最后一个元素遍历到第一个元素。每当遇到某个颜色 a[i],如果该颜色不在 seen 集合中,说明它是最后一次出现的那个颜色,将其加入 result 列表,并将该颜色添加到 seen 集合中。
结果反转: 由于是从后往前遍历,所以最终结果顺序需要通过 result[::-1] 反转。