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