题目描述
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
解析
正常的解法肯定是对每个元素使用一个hashmap,存元素及出现次数,然后通过set去查找是否有重复,但是在上一题(2215)的基础上,可以通过面向输入编程,依旧是创建数组然后对应位置加加,这样操作后再用set去查找。
int[] times = new int[2001];for(int n : arr){times[n + 1000] ++;}Set<Integer> seen = new HashSet<>();for (int num : times) {if (num != 0 && !seen.add(num)) {return false;}}return true;
实际上还可以优化,得到每个元素的次数后,可以遍历这个数组,将出现次数再次映射到一个bool数组中(最多出现1000次),需要注意的是要将0除去,同时某个元素找完了就不用要再判断了。
public boolean uniqueOccurrences(int[] arr) {int[] map = new int[2001];for (int x : arr) {map[x + 1000] ++;}boolean[] count = new boolean[1001];for (int x : arr) {int num = map[x + 1000];map[x + 1000] = 0;if (num != 0 && count[num]) {return false;}count[num] = true;}return true;}