题干分析:
通过阅读该题可以发现本题是要求两个数组中元素的交集,但是由于返回值并不是该数组中的两个2,而是一个2,所以该题目只要求两个数组中重复的元素,且元素不能重复。所以该题目概况下来有以下两个难点:1.找到两个数组中的共同的元素;2.将相同的元素只记一次。
解题分析:
对于问题一,根据我们常规的思考习惯,首先我们是分别比较两个数组中的所有元素,发现两个数组中的重复元素。基于上述思考过程,我们可以使用两个for循环来将数组1中的所有元素一个一个的和数组2中的元素进行比对,如果在比较的过程中发现两个元素相等,那么就找到了两个数组中的重复元素。
对于问题二,由于需要将重复的元素进行一个数组的形式展示,所以首先想到的是创建一个数组进行来存储发现的重复的元素,然后还要进行其中相同的元素的删除,或者在找到重复的元素时就利用一个判断语句来进行判断所存储的数组中有没有该重复元素,但是这样实现起来比较复杂和困难。想到了java中的集合里面的List可以用来存储数据,且数据不能重复,所以能够很好的达到题目中的要求,List接口中的子类有TreeSet、HashList和LinkedHashSet,由于不需要制定顺序,所以选择后两者,本题中我们选择和存储顺序一致的Set,最终选择了LinkedHashSet。
问题解决:
importjava.util.Iterator;
importjava.util.LinkedHashSet;
importjava.util.Set;
publicclass Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set=new LinkedHashSet<Integer>();
for(inti=0;i<nums1.length;i++){
for(intj=0;j<nums2.length;j++){
if(nums1[i]==nums2[j]){
set.add(nums1[i]);
}
}
}//前部分的代码解决了找出重复元素并将该元素无重复的存储
int[] arr=new int[set.size()];
int m=0;
for(Iterator<Integer>it=set.iterator();it.hasNext();){
arr[m]=it.next();
m++;
}
return arr;
}
}
本题总结:
在做题的过程中遇到了将Set集合中的元素转化为整型数组返回的问题,虽然Set集合中提供了toString()的方法,但是转化后的都不是int数组类型,本文提高了一个较为巧妙的方法(该方法都是本人自己一拍脑袋想到的,如有雷同,纯属巧合),利用迭代器,将Set中的元素的值一个一个的传给一个自己定义的int型数组,然后传完之后角标自动加一,这样就能够很好的解决上面的问题,挺巧妙的。代码提交后最终只击败了3.5%的人,可能是有人对数组进行了一些如都是空等假设的考虑,然后快速返回,从而节约时间。
读者在阅读本文的过程中如果有什么想法,欢迎留言指正。