我一上来面试官就让我写一个代码
给你一个数组,取出第一个达到次数最多的数字
我以为的是1 3 3 1 4 第一个达到次数的是3 但他说是1,是按照存入的顺序来算的。
例如:
输入:1 3 4 1 3
输出:1
输入:1 3 3 1 4
输出:1
输入:3 1 1 4 3
输出:3
思路:
一开始就想到了用HashMap,Key值存储数字,Value代表出现的次数,然后遍历找出Value最大的值,但是后来实现的时候行不通。
注意注意:这个是错误解法
代码实现:
public static int find(int[] num) {
int count=1;//数字出现的次数
Map<Integer,Integer> m=new HashMap<>();
for (int i=0;i<num.length;i++){
if(m.containsKey(num[i])){
m.put(num[i],m.get(num[i])+1);
}else{
m.put(num[i],count);
}
}
int result=0;
int most=0;//找出map中出现次数最多的元素
Iterator iter=m.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry =(Map.Entry)iter.next();
int key=(Integer)entry.getKey();
int val=(Integer)entry.getValue();
if(val>most){
result=key;
most=val;
}
}
return result;
}
}
上面这个代码是错误的,比如输入代码 3 3 1 1 5 它返回的还是1 而不是3,所以有点错误
所以就修改了
新思路如下:
一般使用map用的最多的就是HashMap,但是HashMap里面的元素是不按添加顺序的,那么除了使用HashMap外,还有什么map接口的实现类可以用呢?这里有2个,treeMap和linkedHashMap,但是,要达到我们的要求:按添加顺序保存元素的,就只有LinkedHashMap。
代码实现:
public static int find(int[] data) {
int count = 1;//数字出现的次数
//使用Map 把他们接收 LinkedHashMap会按存入的顺序排序
Map<Integer, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < data.length; i++) {
if (map.containsKey(data[i])) { //如果map中的key包含数组中的第i个元素
//就把他出现的次数 +1
map.replace(data[i], map.get(data[i]),map.get(data[i]) + 1);
} else {//如果没有的话 就新增
//然后数字对应的次数为1次
map.put(data[i], count);
}
}
int result = 0; //K
int most = 0; //找出map中出现次数最多的元素 V
Iterator iterator = map.entrySet().iterator();
//遍历集合,然后开始判断集合中出现次数最多的元素是哪个
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
int key = (Integer) entry.getKey();
int val = (Integer) entry.getValue();
//1-2 3-2 4-1
if (val > most) {
result = key;
most = val;
}
}
return result;
}