题目:
/* 给你一个整数数组 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的长度。
总结:避免不必要的操作,例如开辟空间,多余的塞数据操作等。