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


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

          所以我们可以这样解:

         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?

          跪求大神指导。。。
      

          

           
           

  • 相关阅读:
    塔吊滑车移动
    csv合并某几列
    合并两个csv
    QFile
    python alphashape
    pip install econml
    csv增加一列
    连接redis数据库日志
    yolov5训练识别钢筋模型
    redis查看某个key的类型
  • 原文地址:https://www.cnblogs.com/wenjiang/p/3210346.html
Copyright © 2020-2023  润新知