【面试】光峰科技

我一上来面试官就让我写一个代码

给你一个数组,取出第一个达到次数最多的数字

我以为的是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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值