问题描述
小S拥有一条由n颗珠子组成的手链,每颗珠子都有一个对应的颜色编号。她希望将手链上相同颜色的珠子进行去重,只保留每种颜色最后出现的那一颗珠子,同时保持珠子原来的相对顺序。
例如,如果珠子的颜色编号是 [1, 2, 1, 3, 4, 2, 4, 4]
,去重后的珠子颜色应该是 [1, 3, 2, 4]
。
题目分析
这道题目要求我们在给定的一系列整数(代表珠子的颜色编号)中,找出每种颜色最后出现的一个珠子,并保持它们原有的相对顺序。关键点在于如何去重以及如何保持相对顺序。
思路分析
-
数据结构选择:由于需要去重并保持相对顺序,我们可以使用
HashSet
来存储已经遇到过哪些颜色,而使用ArrayList
来动态收集结果。 -
算法流程:
- 初始化一个
HashSet
存储已经遇到的颜色。 - 初始化一个
ArrayList
存储最终结果。 - 从右向左遍历输入数组,检查当前颜色是否已经在
HashSet
中。 - 如果不在,那么将此颜色添加到
HashSet
并添加到ArrayList
中。 - 完成遍历后,将
ArrayList
转换成数组并返回。
- 初始化一个
代码分析
java
深色版本
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static int[] solution(int n, int[] a) {
HashSet<Integer> set = new HashSet<>();
List<Integer> res = new ArrayList<>();
for(int right=n-1;right>=0;left--){
if(!set.contains(a[right])){
res.add(a[right]);
set.add(a[right]);
}
}
int s = 0;
int[] result= new int[res.size()];
for(int i=res.size()-1;i>=0;i--){
result[s++]=res.get(i);
}
return result;
}
public static void main(String[] args) {
System.out.println(Arrays.equals(solution(8, new int[]{1, 2, 1, 3, 4, 2, 4, 4}), new int[]{1, 3, 2, 4}));
System.out.println(Arrays.equals(solution(5, new int[]{5, 5, 5, 5, 5}), new int[]{5}));
System.out.println(Arrays.equals(solution(6, new int[]{6, 1, 2, 6, 1, 2}), new int[]{6, 1, 2}));
}
}
关键步骤解析
- HashSet 使用:
HashSet
用于快速判断某个颜色是否已经被添加过,从而避免重复。 - ArrayList 添加:只有当颜色没有被添加过时,才会将其添加到
ArrayList
中,以确保每种颜色只保留最后一个出现的实例。 - 反向遍历:从右向左遍历是为了确保每种颜色最后出现的那个珠子会被优先添加到结果集中。
- 结果转换:最后将
ArrayList
转换回数组格式,以便与题目要求匹配。
题目总结
本题主要考察了对集合数据结构的理解和应用能力,特别是 HashSet
和 ArrayList
的结合使用。通过合理的数据结构选择和遍历方向调整,我们实现了既去重又保持相对顺序的要求。这种思路不仅适用于本题,也广泛应用于许多需要高效去重场景的问题中。
这段代码简洁明了,有效地解决了题目提出的问题。通过学习和实践这类问题,可以帮助提升我们的编程技巧和解决问题的能力。