面试常备题(四)---统计数组中出现的所有数字的个数

      这道题目非常常见,一拿到手,首先想到的就是有序和无序,如果是无序,可以先转化为有序,但仔细一想,发现这样不对啊!就算排完序,还是得一个一个比较,然后统计不重复的数字的个数!干脆一开始就比较算了。。。

      所以我们可以这样解:

     public static void search(int[] array) {
        int len = array.length;
        for (int i = 0; i < len; i++) {
            if (list.indexOf(array[i]) == -1) {
                list.add(array[i]);
                map.put(array[i], 1);
            } else {
                int num = map.get(array[i]) + 1;
                map.put(array[i], num);
            }
        }
        Set keys = map.keySet();
        Iterator iterator = keys.iterator();
        while (iterator.hasNext()) {
            Integer key = (Integer) iterator.next();
            System.out.println(key + "出现的次数: " + map.get(key));
        }
    }

      既然是统计不重复的数字的个数,使用Map比较好,但如何知道Map的Key值到底有没有重复呢?这里我用一个List的IndexOf()方法来确保Key值不是重复的。

      但问题来了:我们新建一个List来存储元素,就是为了调用它的一个方法:IndexOf(),这样好吗?

      答案当然是不好的!效率非常低,但Map到底有没有方法来确保它的Key值是唯一的呢?本来Map的实现就是无论如何Key都是唯一的,但我们的重点就是如何修改Key的Value值,前面还得判断该Key是否已在Map的KeySet中?

       有一种利用异常的方法:

    public static void search(int[] array) {
        int len = array.length;
        int num = 0;
        for (int i = 0; i < len; i++) {
            try {
                num = map.get(array[i]);
            } catch (Exception e) {
                map.put(array[i], 1);
                continue;
            }
            map.put(array[i], num + 1);
        }
        Set keys = map.keySet();
        Iterator iterator = keys.iterator();
        while (iterator.hasNext()) {
            Integer key = (Integer) iterator.next();
            System.out.println(key + "出现的次数: " + map.get(key));
        }
    }

      利用NullPointException来确定是否有该Key。

      当然,我们可以遍历KeySet来确定是否有该Key,但每一次都要这么搞吗?这不是和List的做法是一样的?

      有没有更好的想法呢?基于Map的Key-Value机制上来确认Key值是否已经存在,前提是不需要遍历KeySet?

      跪求大神指导。。。
  

      

       
       

原文地址:https://www.cnblogs.com/wenjiang/p/3210346.html