package com.pshdhx.easy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
* 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
* @author pshdhx
* 入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
*
*/
public class UniqueOccurrences {
/**
* 没什么想法,还是暴力枚举,用list和set的大小来判断有无重复数据;
* @param arr
* @return
*/
public boolean uniqueOccurrences(int[] arr) {
Set<Integer> set2 = new HashSet(); //用set来存储数组中去重后的数据,用来进行第一次遍历
for(int i=0;i<arr.length;i++) {
set2.add(arr[i]);
}
List<Integer> list = new ArrayList<>();
Set<Integer> set = new HashSet();
for(Iterator iterator = set2.iterator();iterator.hasNext();) {
int a = (int)iterator.next();
int count = 0; //计数器
for(int j=0;j<arr.length;j++) {
if(a == arr[j]) {
++count;
}
}
list.add(count);
set.add(count);
}
//System.out.println(list.toString());
//System.out.println(set.toString());
//在判断list中有没有相同的数据,返回true or false
if(set.size() == list.size()) { //没有重复的数据
return true;
}else {
return false;
}
}
/**
* 哈希法
* @param arr
* @return
*/
public boolean uniqueOccurrences2(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();
}
public static void main(String[] args) {
boolean uniqueOccurrences = new UniqueOccurrences().uniqueOccurrences(new int[] {1,2});
System.out.println(uniqueOccurrences);
}
}