问题描述
小S拥有一条由n颗珠子组成的手链,每颗珠子都有一个对应的颜色编号。她希望将手链上相同颜色的珠子进行去重,只保留每种颜色最后出现的那颗珠子,同时保持珠子原来的相对顺序。
例如,如果珠子的颜色编号是 [1, 2, 1, 3, 4, 2, 4, 4],去重后的珠子颜色应该是 [1, 3, 2, 4]。
测试样例
样例1:
输入:
n = 8 ,a = [1, 2, 1, 3, 4, 2, 4, 4]
输出:[1, 3, 2, 4]
样例2:
输入:
n = 5 ,a = [5, 5, 5, 5, 5]
输出:[5]
样例3:
输入:
n = 6 ,a = [6, 1, 2, 6, 1, 2]
输出:[6, 1, 2]用户的代码定义了一个名为solution的函数,该函数接受两个参数:n(珠子的数量)和a(珠子的颜色列表)。函数的目标是去除重复的颜色,只保留每种颜色最后一次出现的那个,并保持珠子的相对顺序。
代码逻辑
-
初始化字典:
python
last_occurrence = {}
这里使用了一个字典
last_occurrence来记录每种颜色最后一次出现的位置。 -
遍历列表,更新字典:
python
for i in range(n):
last_occurrence[a[i]] =
i
通过遍历珠子列表
a,将每种颜色的最后出现位置记录在字典last_occurrence中。 -
初始化结果列表:
python
result = []
初始化一个空列表
result,用于存储去重后的珠子颜色。 -
根据字典中的记录,构建结果列表:
python
for i in range(n):
if last_occurrence[a
[i]] == i:
result.append(a[i])
再次遍历珠子列表
a,如果当前珠子的位置与字典中记录的最后出现位置一致,则将该珠子颜色添加到结果列表result中。 -
返回结果:
python
return result
返回去重后的珠子颜色列表。
代码测试
用户在 if __name__ == '__main__': 部分添加了测试用例,用于验证代码的正确性。
# 初始化字典,记录每种颜色最后一次出现的位置
last_occurrence = {}
# 遍历列表,更新字典
for i in range(n):
last_occurrence[a[i]] = i
# 初始化结果列表
result = []
# 根据字典中的记录,构建结果列表
for i in range(n):
if last_occurrence[a[i]] == i:
result.append(a[i])
return result
if __name__ == '__main__':
print(solution(n = 8, a = [1, 2, 1, 3, 4, 2, 4, 4]) == [1, 3, 2, 4])
print(solution(n = 5, a = [5, 5, 5, 5, 5]) == [5])
print(solution(n = 6, a = [6, 1, 2, 6, 1, 2]) == [6, 1, 2])
复杂度分析
-
时间复杂度:
- 遍历列表
a更新字典的时间复杂度是 O(n)。 - 再次遍历列表
a构建结果列表的时间复杂度是 O(n)。 - 因此,总的时间复杂度是 O(n)。
- 遍历列表
-
空间复杂度:
- 使用了一个字典
last_occurrence来存储每个元素的最后出现位置,字典最多需要存储 n 个不同的元素。 - 所以,空间复杂度是 O(n)。
- 使用了一个字典
总结
这段代码的主要目的是根据元素在列表中最后出现的位置去重并输出元素,确保每个元素只出现一次,且按其最后一次出现的顺序排列。通过使用字典来记录元素的最后出现位置,可以在遍历列表时高效地判断每个元素是否为它最后一次出现,从而避免重复元素的出现。这种方法的时间复杂度为 O(n),是一种高效的解决方案。