349. Intersection of Two Arrays

做这个题的时候才发现自己真的不懂java中的集合类,感觉没学过java....然后花了一点时间补了一些集合类的基本用法。

本题代码是我参考LeetCode上优秀题解写的,至少会用了ArrayList,HashSet,迭代器,foreach啥的。

源码:

class Solution {
    
    public int[] set_intersection(HashSet<Integer> set1,HashSet<Integer> set2){
        int [] output=new int[set1.size()];
        int s=0;
        for(Integer key:set1)
            if(set2.contains(key))
                output[s++]=key;
        return Arrays.copyOf(output,s);
    }
    
       public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set1=new HashSet<Integer>();
        for(Integer set:nums1)
            set1.add(set);
        
        HashSet<Integer> set2=new HashSet<Integer>();
        for(Integer set:nums2)
            set2.add(set);
        
        if(set1.size()<set2.size())
           return  set_intersection(set1,set2);
        else
           return  set_intersection(set2,set1);
    }
    
}

分析:最核心的一点:用HashSet类的特性去掉重复元素。

1.  首先从intersection函数先分析,首先创建HashSet集合,把num1/num2数组中的元素通过foreach循环遍历,每一个都放到set1/set2集合中去了。【当不要修改集合或数组中元素时,用foreach循环遍历还是比写几行for循环更简洁的,并且不用知道数组的大小。】

这里的几步就是正好利用了hashset的特性,元素无序且不可重复。存入的时候hashset的机制已经可以保证不会存进去重复的数了,保证了上面这个函数进行交集判断时不会读进去重复的数。【机制就是:hashset类中的hashcode()确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素。】

2.  然后根据两个数组的大小分别调用函数set_intersection(),就是让长的那个数组在第一个参数,方便后续处理。

在函数set_intersection()中,集合set1更小,当然最后取交集的话,是以更小的集合为准的。后面用foreach循环,调用contains方法,判断集合中两个已经经过处理的,去重了的集合中,有没有相同的元素,有的话,就存到最终的结果集中。【contains()方法是collection接口中的方法,后面继承的所有类都可以使用的。】最后返回结果用到了Arrays.copyOf()方法。【该方法不仅仅只是拷贝数组中的元素,它在拷贝元素时,会创建一个新的数组对象,而与之有些类似的System.arrayCopy方法只拷贝已经存在数组元素。】

 

【本题解法持续更新中】

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值