今日学习的文章链接和视频链接
leetcode题目地址:349. 两个数组的交集
代码随想录题解地址:代码随想录
题目简介
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
看到题目的第一想法(可以贴代码)
1. 对数组去重,主要是涉及各种类型转换。
用 Set集合?Set<String> animals = new HashSet<>(); (放弃)
用 Stream 的装箱 boxed()方法,List的distinct?
public int[] intersection(int[] nums1, int[] nums2) {
List<Integer> collect1 = Arrays.stream(nums1).distinct().boxed().collect(Collectors.toList());
List<Integer> collect2 = Arrays.stream(nums2).distinct().boxed().collect(Collectors.toList());
ArrayList<Integer> res1 = new ArrayList<Integer>();
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<Integer> set1 = new HashSet<>();
Set类型转int[]:
resSet.stream().mapToInt(x -> x).toArray();
看完视频自己写的ACC:
Integer[] arrInteger1 = Arrays.stream(nums1).boxed().toArray(Integer[]::new);
Set<Integer> s1 = Arrays.stream(arrInteger1).collect(Collectors.toSet());
Set<Integer> res = new HashSet<Integer>();
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<String> animals = new HashSet<>();
2. int[] 转 List 去重:
List<Integer> collect = Arrays.stream(arr).distinct().boxed().collect(Collectors.toList());
3. int[] 直接输出:(转String)
System.out.println("原始数据: " + Arrays.toString(arr));
4. ArrayList<String>与String[] 数组互相转换:
List<String> a = new ArrayList<String>();
String[] arr = a.toArray(new String[a.size]);
List<String> list = Arrays.asList(arr);
5. ArrayList<Integer>如何转换为int[]数组:
ArrayList<Integer> a = new ArrayList<Integer>();
int[] array=(int[])a.toArray(new int[size]); //会报错,因为int[]并不等同于Integer[]
Integer[] array = list.toArray(new Integer[list.size()]); //能正确运行
【int数组转List<Integer>集合 以及 List<Integer>集合转int数组】
int[] intArr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
// int[] -> List<Integer>
List<Integer> integerList = Arrays.stream(intArr).boxed().collect(Collectors.toList());
// List<Integer> -> int[]
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<Integer> 集合转Integer数组】
// Integer[] -> List<Integer>
integerList = Arrays.asList(integerArr);
// List<Integer> -> Integer[]
Integer[] integerArr = integerList.toArray(new Integer[integerList.size()]);
【另一篇文章】
int []arr = {1,2,3,4,5,6};
// int[] 转List boxed: 装箱:将基本类型转成包装类
List<Integer> 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<Integer>
List<Integer> 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<Integer>,int[],Integer[]
7. List 的常用方法:
-
add() - 将元素添加到列表
-
addAll() - 将一个列表的所有元素添加到另一个
-
get() - 有助于从列表中随机访问元素
-
iterator() - 返回迭代器对象,该对象可用于顺序访问列表的元素
-
set() - 更改列表的元素
-
remove() - 从列表中删除一个元素
-
removeAll() - 从列表中删除所有元素
-
clear() - 从列表中删除所有元素(比removeAll()效率更高)
-
size() - 返回列表的长度
-
toArray() - 将列表转换为数组
-
contains() - 如果列表包含指定的元素,则返回true