前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个整数数组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
分析过程
定义一个集合map,遍历一次数组arr,利用集合map的key值不会重复的特性来统计各个元素出现的次数,各个元素的次数保存到集合map中。
定义一个列表list,保存集合map中的元素出现的次数。
遍历集合map,获取每个元素出现的次数,利用列表list的contains方法来判断后面的元素出现次数是否和前面的元素出现次数相等。
若当前元素出现的次数没有和其他元素出现的次数相等,那么保存元素出现的次数到列表list中。
若有一个元素出现的次数和其他元素出现的次数相等了,那么元素出现的次数就不是独一无二了,此时返回false。
若能遍历完map集合,则证明没有一个元素出现的次数相同,次数是独一无二的,此时返回true。
解答代码
class Solution {
public boolean uniqueOccurrences(int[] arr) {
// 定义集合map
Map<Integer, Integer> map = new HashMap<>();
// 遍历数组arr
for (int e : arr) {
if (map.containsKey(e)) {
// 若集合map中已有数组元素,元素出现次数加1
int count = map.get(e);
map.put(e, ++count);
} else {
// 若集合map中没有数组元素,推进map集合,元素出现次数为1
map.put(e, 1);
}
}
// 定义列表list,保存元素出现次数
List<Integer> list = new ArrayList<>();
// 遍历集合map
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
// 获取元素出现次数
int value = entry.getValue();
if (list.contains(value)) {
// 若有一个元素出现次数相同,那么次数就不是独一无二了
return false;
} else {
// 若元素出现次数没有和其他元素出现次数相同,推进列表list
list.add(value);
}
}
// 若能遍历完集合map,则证明没有一个元素出现次数相同,次数是独一无二的
return true;
}
}
提交结果
执行用时2ms,时间击败90.97%的用户,内存消耗36.5MB,空间击败35.67%的用户。
运行结果原文链接
原文链接:独一无二的出现次数
网友评论