leetcode题目地址:349. 两个数组的交集
代码随想录题解地址:代码随想录
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
1. 对数组去重,主要是涉及各种类型转换。
用 Set集合?Set
用 Stream 的装箱 boxed()方法,List的distinct?
public int[] intersection(int[] nums1, int[] nums2) {
List collect1 = Arrays.stream(nums1).distinct().boxed().collect(Collectors.toList());
List collect2 = Arrays.stream(nums2).distinct().boxed().collect(Collectors.toList());
ArrayList res1 = new ArrayList();
int index = 0;
for (int i : collect1){
if (collect2.contains(i)){
res1.add(i);
}
}
int[] res2 = res1.stream().mapToInt(Integer::intValue).toArray();
return res2;
}
1. return数组的时候,长度是固定的,需要先用ArrayList存,再类型转换。
【解题思路】用 Set 写(适用于输入值很大/数据量),用数组写(适用于int[]输入值比较小)。
本题用 set 写。
【想法】
1. 只需要对nums1去重,再遍历nums2判断时候contains(无需对nums2去重)。
2. C++里的set:
①set(底层实现:红黑树)
②unordered_set(哈希值) //映射、取值效率最高
③multi_set(红黑树)
3. C++里unordered_set转换为int[],可以利用vector。
4. C++里如果用数组int[] 写:先定义一个比较大的哈希数组(以nums1元素值作为其下标,若存在,则设为1),再遍历nums2,如果其哈希值==1,则计入res里,res用unordered_set定义起到去重效果,再转为int[]。
5. java解法:
初始化Set:
Set set1 = new HashSet<>();
Set类型转int[]:
resSet.stream().mapToInt(x -> x).toArray();
Integer[] arrInteger1 = Arrays.stream(nums1).boxed().toArray(Integer[]::new);
Set s1 = Arrays.stream(arrInteger1).collect(Collectors.toSet());
Set res = new HashSet();
for (int i : nums2){
if (s1.contains(i)){
res.add(i);
}
}
return res.stream().mapToInt(x -> x).toArray();
9:45 ~ 10:31 解题成功
10:31 ~ 10:52 看视频题解、写博客
1. Set初始化:(使用HashSet该类来实现Set接口)
Set
2. int[] 转 List 去重:
List
3. int[] 直接输出:(转String)
System.out.println("原始数据: " + Arrays.toString(arr));
4. ArrayList
List
String[] arr = a.toArray(new String[a.size]);
List
5. ArrayList
ArrayList
int[] array=(int[])a.toArray(new int[size]); //会报错,因为int[]并不等同于Integer[]
Integer[] array = list.toArray(new Integer[list.size()]); //能正确运行
【int数组转List
int[] intArr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
// int[] -> List
List
// List
int[] intArr = integerList.stream().mapToInt(Integer::intValue).toArray();
【int数组转Integer[] 数组 以及 Integer[] 转int 数组】
// int[] -> Integer[]
Integer[] integerArr = Arrays.stream(intArr).boxed().toArray(Integer[]::new);
// Integer[] -> int[]
intArr = Arrays.stream(integerArr).mapToInt(Integer::valueOf).toArray();
【Integer数组转List
// Integer[] -> List
integerList = Arrays.asList(integerArr);
// List
Integer[] integerArr = integerList.toArray(new Integer[integerList.size()]);
【另一篇文章】
int []arr = {1,2,3,4,5,6};
// int[] 转List boxed: 装箱:将基本类型转成包装类
List list = Arrays.stream(arr).boxed().collect(Collectors.toList());
System.out.println(list);
// int[] 转 integer[]
Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
//List<> 转 Integer[]
Integer[] arr3 = list.toArray(new Integer[0]);
// List<> 转 int[]
int[] arr4 = list.stream().mapToInt(Integer::intValue).toArray();
//Integer[] 转 int[]
int[]arr5 = Arrays.stream(arr3).mapToInt(Integer::intValue).toArray();
// Integer[] 转 List
List list2 = Arrays.asList(arr2);
6. 关于输出:
输出 int[]:System.out.println("Stream去重: " + Arrays.toString(arr));
输出List:System.out.println("Stream去重: " + self_list);
7. 【几种涉及的java类型】Set(HashSet),Lits(ArrayList),List
7. List 的常用方法:
add() - 将元素添加到列表
addAll() - 将一个列表的所有元素添加到另一个
get() - 有助于从列表中随机访问元素
iterator() - 返回迭代器对象,该对象可用于顺序访问列表的元素
set() - 更改列表的元素
remove() - 从列表中删除一个元素
removeAll() - 从列表中删除所有元素
clear() - 从列表中删除所有元素(比removeAll()效率更高)
size() - 返回列表的长度
toArray() - 将列表转换为数组
contains() - 如果列表包含指定的元素,则返回true