珠子颜色去重 | 豆包MarsCode AI刷题

118 阅读2分钟

问题描述

小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] 反转。