题解一
思路
通过上一期的学习,发现这里的nums数组的取值是有范围的,所以可以使用数组做哈希表,在第一个循环用一个集合(因为不定长)进行存储,第二个循环进行比对,查看在集合中有没有数组2中的元素存在。最后重新建一个数组存储集合中的元素。
代码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int[] nums =new int[1002];
List<Integer> resultList = new ArrayList<>();
for(int i=0;i<nums1.length;i++){
nums[nums1[i]]++;
}
for(int i=0;i<nums2.length;i++){
if(nums[nums2[i]]!=0){
resultList.add(nums2[i]);
nums[nums2[i]]=0;
}
}
int res[] = new int[resultList.size()];
int index = 0;
for(int i : resultList)
res[index++]=i;
return res;
}
}
收获
学会使用一个新的数据结构(不知道是不是该叫做数据结构)——集合。个人感觉可以作为不定长数组使用非常的方便。
题解二
思路
因为在原来的题目中数组中的元素是没有范围限制的,因此无法用数组做哈希表存储(数组过大,浪费空间太多),因此用了新的数据结构HashSet,HashSet的特点是无序且不可重复,底层是HashMap。解题思路和题解一差不多,用一个HashSet进行存储,然后用contains()函数进行比较,然后用另一个HashSet存储结果,因为HashSet的特点,所以无序再进行去重。
代码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int num :nums1){
set1.add(num);
}
for(int num :nums2){
if(set1.contains(num)){
result.add(num);
}
}
返回值有两种不同的写法
方法一:直接将HashSet类型转换为int数组
return resSet.stream().mapToInt(x -> x).toArray();
方法二:新建一个int数组存储HashSet中的元素
int[] arr = new int[resSet.size()];
int j = 0;
for(int i : resSet){
arr[j++] = i;
}
return arr;
思考
在题解二中,学到了新的数据结构HashSet,知道了它无序且不可重复的特点。知道了如何将HashSet直接转化为int[]类型(第一种还不知道底层原理)。
在if判断中,nums1==null是判断nums1是不是进行了初始化,nums1.length==0是判断nums1中是否含有元素。(此题已限定数组长度至少为1,故无需再进行判断)
1258

被折叠的 条评论
为什么被折叠?



