题干分析:
根据题目中所给的信息,首先题干中给出两个数组,然后找出这两个数组都出现的元素,并且该元素在两个数组中出现的次数也要通过找出来。
解题分析:
首先经过前几天的推送,想必大家已经对于利用Map的方法来进行数组中元素的统计以及相应元素出现的次数有了一个很好的了解。本题借助于Map方法将进一步介绍如何解和数组元素以及相应频次相关的问题。对于本题可以利用Map方法统计两个数组的每个元素以及相应的频次,然后找出相同的元素,获得对于该元素所统计的频次。根据有哪些元素重复,重复了多少次这两个信息就完全可以把本题解决啦。
问题解决:
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> map1 = newHashMap<Integer,Integer>();
int value1=1;
for(int i=0;i<nums1.length;i++){
if(map1.containsKey(nums1[i])){
value1=map1.get(nums1[i]);
value1++;
}else
value1=1;
map1.put(nums1[i], value1);
}
Map<Integer,Integer> map2 = newHashMap<Integer,Integer>();
int value2=1;
for(int i=0;i<nums2.length;i++){
if(map2.containsKey(nums2[i])){
value2=map2.get(nums2[i]);
value2++;
}else
value2=1;
map2.put(nums2[i], value2);
}
int b=0;
int[] arr=new int[Math.max(nums1.length, nums2.length)];
int l=0;
Set<Map.Entry<Integer,Integer>> set2=map2.entrySet();
for(Iterator<Entry<Integer, Integer>>it=set2.iterator();it.hasNext();){
Map.Entry<Integer,Integer> entry2=it.next();
Object key2=entry2.getKey();
if(map1.containsKey(key2)){
b=Math.min(map1.get(key2), map2.get(key2));
for(int k=0;k<b;k++){
arr[l]=(int) key2;
l++;
}
}
}
int[] arr1=Arrays.copyOfRange(arr, 0, l);
return arr1;
}
}
本题总结:
1.怎么获得两个map中的重复元素。可以通过取出一个map中存储的key,然后判断另外一个map中有没有该key,如果也含有,那么就表示这两个数组有重复的key,然后利用map.get(key)方法获取这两个key所各自所记得频次进行比较,依次遍历另一个map中的key就可以完全找出重复的元素了。其中获取map中的key可以利用map.entry的方法,该方法可以获得map中所有存储的键值关系。遍历map中的元素可以利用Iterator迭代器来完成。
2.在获得了重复的元素以及相应重复的次数之后,接下来就是如何如何将这些元素用数组的形式表现出来的问题。我们可以利用“指针”的思想,具体为首先在创建的新数组中的第一位存储我们找出的第一个元素,然后如果该元素重复了n次,那么我们在存了一次这个数之后就把相应的角标标记加1,这样依次进行存储就可以存储n个相同的重复元素了。然后根据所标记的角标又可以在数组中接着存储重复的元素以及对应的次数。这样,当把所有的重复的元素以及相应的次数存储到数组中之后根据这个标记我们也知道总共存储了多少元素,即该数组的长度。然后利用Arrays.copyOfRange(arr, 0, l)把多余的空置空间去除就可以了。是不是挺巧妙的(纯靠自己的想象想到的这个方法,如有雷同,纯属巧合^_^)最终击败10.44%对手。