# 独一无二的出现次数 给你一个整数数组`arr`,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回`true`;否则返回`false`。 ## 示例 ``` 输入:arr = [1,2,2,1,1,3] 输出:true 解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。 ``` ``` 输入:arr = [1,2] 输出:false ``` ``` 输入:arr = [-3,0,1,-3,1,1,1,-3,10,0] 输出:true ``` ## 题解 ```javascript /** * @param {number[]} arr * @return {boolean} */ var uniqueOccurrences = function(arr) { var hashTable = Object.create(null); arr.forEach(v => { if(hashTable[v] === void 0) hashTable[v] = 1; else ++hashTable[v]; }) var keys = Object.keys(hashTable); var values = Object.values(hashTable); return keys.length === [...new Set(values)].length; }; ``` ## 思路 使用哈希表记录每个数字出现的次数,之后使用`Set`处理出现的次数,然后对比哈希表的长度即可,首先定义一个哈希表,在此处是使用`Js`的普通对象的形式,此处只是为了借助其结构所以不需要原型指向,另外在`Js`中提供了`Map`对象作为键值对哈希表的解决方案,之后遍历数组,如果未定义,那么就将哈希表的此键值的值设置为`1`,如果键值在哈希表中定义,那么就将其值加`1`,之后获取对象中所有的键数组,以及所有的值数组,之后将值数组作为参数传入`Set`对象去重,之后用`Spread`操作符将其展开并形成一个新数组,之后获取其长度与键数组的长度作比较并返回即可。 ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 参考 ``` https://leetcode-cn.com/problems/unique-number-of-occurrences/ ```