题号349
我尝试硬解失败
/*class Solution {public int[] intersection(int[] nums1, int[] nums2) {int n1=nums1.length;int n2=nums2.length;int size=Math.min(n1,n2);int []arr=new int[size];int count=0;for(int i=0;i<n1;i++){outerloop:for(int j=0;j<n2;j++){if(nums1[i]==nums2[j]){for(int k=0;k<count;k++){if(nums1[i]==arr[k])break outerloop;}arr[count]=nums1[i];count++;break;}}}return arr;}
}*/
因为返回的数组会带有默认的0无法消除
另解:使用哈希集合
class Solution {public int[] intersection(int[] nums1, int[] nums2) {int n1=nums1.length;int n2=nums2.length;//创建哈希集合Set <Integer> set1=new HashSet<Integer>();Set <Integer> set2=new HashSet<Integer>();for(int num:nums1){set1.add(num);}for(int num:nums2){set2.add(num);}return getIntersection(set1,set2);}public int [] getIntersection(Set<Integer>set1,Set<Integer>set2){//保证set1是较小的集合if(set1.size()>set2.size())return getIntersection(set2,set1);Set <Integer> newSet=new HashSet <Integer>();for(int num:set1){if(set2.contains(num))//自带的函数newSet.add(num);}//创建一个数组便于返回int []arr=new int[newSet.size()];int count=0;for(int num:newSet){arr[count++]=num;}return arr;}
}
再另解:改进我的解法
我的解法之所以失败是因为数组长度固定,默认值会导致错误,而Java中可以用列表数据类型来代替,其长度可变,最后返回时再转为数组即可
而可以改进的地方在于,这种解法,先用哈希集合把set1元素记录,然后再遍历set2,如果发现有相同元素则在哈希集合中把该值删除,并加入列表中。
class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set <Integer> set=new HashSet <Integer>();for(int num:nums1){set.add(num);}List <Integer>list=new ArrayList<>();for(int num:nums2){if(set.remove(num))//有 则顺手删除list.add(num);}//将列表转为数组int []arr=new int[list.size()];int count=0;for(int num:list){arr[count++]=num;}return arr;}
}