题目: 

/* 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
 *
 * 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
 *
 *  
 *
 * 示例 1:
 *
 * 输入:arr = [1,2,2,1,1,3]
 * 输出:true
 * 解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
 * 示例 2:
 *
 * 输入:arr = [1,2]
 * 输出:false
 * 示例 3:
 *
 * 输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
 * 输出:true
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/unique-number-of-occurrences
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

 

  这是自己写的方法:

  逻辑为:第一步遍历arr,用map装载<元素,出现次数>                                                                                           

      第二步创建另一个map2(用来装载map的<出现次数,object>),并遍历map的keySet,                        

      int o=(int)iterator.next();获取对应元素的出现次数,并判断是否在map2中出现,如果已经存在,则返回false,并break

 

  遍历全arr + 取出元素+判断是否存在map中 + 不在就添加进map|在就break

 

public class test01 {
    public static boolean uniqueOccurrences(int[] arr) {
        boolean flag=true;
        //1.使用map来装载数组内的参数和参数出现的次数
        HashMap<Integer,Integer> map=new HashMap();
        HashMap keyMap=new HashMap();
        map=getTimes(arr);
        //2.循环遍历map,如果有重复的 则break,返回false
        //获取map的键值集合并遍历
        Set set=map.keySet();
        Iterator iterator=set.iterator();
        while(iterator.hasNext()){
            int o=(int)iterator.next();
            Object k=map.get(o);
            //如果集合包含k,说明重复,break,返回false
            if(keyMap.containsKey(k)){
                flag=false;
                break;
            }
            keyMap.put(k,0);
        }
        return flag;
    }

    /**
     1.输入参数:数组
     2.输出参数:HashMap
     3.实现功能:统计数组内各个元素出现的次数*/
    public static HashMap<Integer,Integer> getTimes(int[] arr){
        HashMap<Integer,Integer> h1=new HashMap();
        h1.put(arr[0],1);
        for(int i=1;i<arr.length;i++){
            if(h1.containsKey(arr[i])){
                int times=h1.get(arr[i]);
                h1.put(arr[i],++times);
            }else{
                h1.put(arr[i],1);
            }
        }
        return h1;
    }

//    public static void main(String[] args) { //--曾志伟的 运行16秒
//
//        int[] arr=new int[10000];
//    for(int i=0;i<10000;i++){
//        arr[i]=(int)(Math.random()*100)+1;
//    }
//        long startTime=System.currentTimeMillis();
//        boolean b=uniqueOccurrences(arr);
//        System.out.println(b);
//        long endTime=System.currentTimeMillis();                //获得当前时间
//        System.out.println(endTime-startTime);
//    }
}

  

 

/**
 * 系统给出的答案:
 *
 * class Solution {
 *     public boolean uniqueOccurrences(int[] arr) {
 *         Map<Integer, Integer> occur = new HashMap<Integer, Integer>();
 *         for (int x : arr) {
 *             occur.put(x, occur.getOrDefault(x, 0) + 1);
 *         }
 *         Set<Integer> times = new HashSet<Integer>();
 *         for (Map.Entry<Integer, Integer> x : occur.entrySet()) {
 *             times.add(x.getValue());
 *         }
 *         return times.size() == occur.size();
 *     }
 * }
 *
 * 作者:LeetCode-Solution
 * 链接:https://leetcode-cn.com/problems/unique-number-of-occurrences/solution/du-yi-wu-er-de-chu-xian-ci-shu-by-leetcode-solutio/
 * 来源:力扣(LeetCode)
 * 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

  

occur.getOrDefault(x, 0) + 1  通过这个map自带的方法,直接代替了我原来的一整个方法(getTimes)。
他逻辑精妙之处,就在于 他取出了我将元素塞进map2的这个过程。他是将map的keyset对应的value(出现次数)放进Set集合,然后比较Set集合和原来map的长度。

总结:避免不必要的操作,例如开辟空间,多余的塞数据操作等。