题干
给你一个整数数组 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
提示:
1 <= arr.length <= 1000
-1000 <= arr[i] <= 1000
解题思路
看到有关统计次数的问题,我们很容易第一时间想到使用哈希表来统计。本题就可以用HashMap来将每个数以及其出现次数统计,要判断它们的出现次数是不是独一无二的,可以利用HashSet集合不能有重复的元素这一特点,将出现次数添加到HashSet集合中,比较set集合和map集合的元素个数是否相等,若相等,则返回true;若不想等,则返回false。
AC代码
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);
}
//HashSet集合不能有重复的元素
Set<Integer> times = new HashSet<Integer>();
for (Map.Entry<Integer, Integer> x : occur.entrySet()) {
times.add(x.getValue());
}
return times.size() == occur.size();
}
}
注意:
- Map<Integer,Integer>:Map是java中的接口,Map.Entry是Map的一个内部接口,表示Map中的一个实体(一个key-value对)。
- Map.put(K key,V value):将指定的值与此映射中的指定键关联。如果映射以前包含一个键的映射,旧值将被指定的值替换。(也就是说,可以将数组的元素及其出现次数放进map)
- Map.getOrDefault():返回指定的键映射的值,或 defaultValue如果这个Map不包含的键映射。(就是说,我可以获得它的value,但是如果一开始它没有值,为空,我就设置defaultValue为0开始)
- Map.Entry<>:返回一个 Set映射的视图包含在这个Map。该集合是由Map的支持,所以对Map的变化反映在集合中,反之亦然。设置支持元素的去除,从Map中移除相应的映射,通过 Iterator.remove, Set.remove, removeAll, retainAll和 clear操作。它不支持 add或 addAll操作。 结果,映射中包含的映射的一个集合视图。(也就是说,我可以通过for (Map.Entry<Integer, Integer> x : occur.entrySet()) ,循环遍历occur这个map类型的变量)
- map.entrySet():返回包含Map映射的一个集合视图(可以通过视图表示map中的元素,然后搭配Entry<>将元素取出来,只是Entry<>是一个接口,表示实体,而视图是虚拟的)
- Map.Entry<>.getValue():返回对应于此项的值
- Set:包含没有重复元素的集合。