题目描述
给定两个数组 nums1
和 nums2
,返回它们的 交集 ,结果中的每个元素 不重复,顺序不限。
示例:
输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]
一、初次尝试 --- ArrayList + Set 混合
1️⃣ 思路
-
用 ArrayList 存结果(可变数组)
-
用 HashSet 存
nums1
元素,方便快速查找
2️⃣ 代码尝试
java
Set<Integer> record = new HashSet<>();
ArrayList<Integer> result = new ArrayList<>();
for(int i = 0; i < nums1.length; i++){
record.add(nums1[i]);
}
for(int i = 0; i < nums2.length; i++){
if(record.contains(nums2[i])){
result.add(nums2[i]); // 可能重复
}
}
// 将 ArrayList 转数组
int[] res = new int[result.size()];
for(int i = 0; i < result.size(); i++){
res[i] = result.get(i);
}
3️⃣ 遇到的问题
-
ArrayList
会重复加入相同元素,结果可能是[2,2]
-
不符合题目要求"结果不重复"
二、第二次尝试 --- 全部用 Set
思路
-
用 HashSet 存
nums1
元素 → 快速查找 -
用 HashSet 存交集结果 → 自动去重
-
最后将结果 Set 转成数组
代码
java
Set<Integer> record = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int num : nums1){
record.add(num);
}
for(int num : nums2){
if(record.contains(num)){
result.add(num); // 自动去重
}
}
// 尝试用普通 for 循环遍历 Set
int[] res = new int[result.size()];
for(int i = 0; i < result.size(); i++){
// ❌ 错误,Set 没有 get(i)
}
问题
-
Set 没有下标,不能用
get(i)
-
需要换一种遍历方法
三、第三次尝试 --- 使用增强 for 循环(最终版)
思路
-
Set → 无下标 → 使用增强 for 循环遍历
-
同时保持自动去重,顺序无关
代码(最终版)
java
Set<Integer> record = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int num : nums1){
record.add(num);
}
for(int num : nums2){
if(record.contains(num)){
result.add(num);
}
}
// Set → int[] 使用增强 for 循环
int[] res = new int[result.size()];
int i = 0;
for(int num : result){
res[i++] = num;
}
return res;
收获
-
增强 for 循环可以遍历 任何实现 Iterable 的集合,不依赖索引
-
HashSet 自动去重,保证结果不重复
-
ArrayList 只在第一次尝试时用过,可变数组概念清楚
四、集合方法总结
数据结构 | 常用方法 |
---|---|
Map | get / put / containsKey |
Set | add / contains |
List | add / contains / get(index) |
五、刷题经验总结
-
可变数组 → ArrayList
-
无重复快速查找 → HashSet
-
Set 转数组 → 使用增强 for 循环
-
刷题流程:注释写在代码上方,说明"做什么 / 为什么",便于回顾