题目
分析
一看到关于出现次数第一反应就是用map集合,有key-value键值对,直接看代码吧,不难,而且他说了就两个数字,已经限定死了
import java.util.*;
public class Solution {
public int[] FindNumsAppearOnce (int[] array) {
//遍历整个数组,用hashmap统计出现的次数,然后将出现一次的存到数组中
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int[] res = new int[2];//题目中已经说明数组中只有两个数,如果没有告诉,就要先用list,然后再放到数组中
int index = 0;//res下标
for(int i = 0 ; i < array.length ; i++){
if(map.get(array[i]) != null){
map.put(array[i],map.get(array[i]) + 1);//map中已经存在就次数+1
}else{
map.put(array[i],1);//map中不存在的则添加进去,次数置为1
}
}
//遍历key集合(可优化)
for(int key : map.keySet()){
if(map.get(key) == 1){
res[index] = key;//出现一次的数字
index++;
}
}
return res;
}
}
当然上述是可以优化的,这就涉及keySet和entrySet的遍历速率问题,相关文章:keySet()和entrySet()进行遍历效率的对比
我们可以看到数据量大的时候明显entrySet快很多,文章也给出了解释
所以可以进一步改进一下遍历方式,代码如下,用迭代器遍历节点entry,而且数据量大时,用iterator遍历速度也快很多
import java.util.*;
public class Solution {
public int[] FindNumsAppearOnce (int[] array) {
//遍历整个数组,用hashmap统计出现的次数,然后将出现一次的存到数组中
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int[] res = new int[2];//题目中已经说明数组中只有两个数,如果没有告诉,就要先用list,然后再放到数组中
int index = 0;//res下标
for(int i = 0 ; i < array.length ; i++){
if(map.get(array[i]) != null){
map.put(array[i],map.get(array[i]) + 1);//map中已经存在就次数+1
}else{
map.put(array[i],1);//map中不存在的则添加进去,次数置为1
}
}
//遍历Entry集合
Iterator<Map.Entry<Integer,Integer>> iterator = map.entrySet().iterator();
Map.Entry<Integer, Integer> entry = null;
while(iterator.hasNext()){
entry = iterator.next();//获取节点
if(entry.getValue() == 1){
res[index++]=entry.getKey();
}
}
return res;
}
}