leeCode算法之独一无二出现次数
题目描述:
给你一个整数数组 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.新建哈希表,首先通过Map对象把整数数组里面的每个数的出现次数和每个数关系映射起来;
2.遍历Map对象,使用Set对象存取每个数的出现次数,并且通过Set.has() 判断对象次数是否出现过,从而找出每个数出现的次数是否是独一无二的
3.话不多说,我们直接来看代码:
function uniqueOccurences(nums) {const map = new Map()for (let val of nums) {// 统计val出现的次数if (map.has(val)) {// 如果之前map存在这个数,则把这次val次数(1次)和 之前val次数相加map.set(val, map.get(val) + 1)} else {// 如果之前map里面不存在这个数,则只需要把这次val次数加上就行(1次)map.set(val, 1)}}let set = new Set();for (let [val, time] of map) {if (set.has(time)) {// 条件如果成立,证明每个数的出现次数不是独一无二的return false;}set.add(time)}return true;}console.log(uniqueOccurences([1, 2])) // falseconsole.log(uniqueOccurences([-3, 0, 1, -3, 1, 1, 1, -3, 10, 0])) // trueconsole.log(uniqueOccurences([1, 2, 2, 1, 1, 3])) // true
第二种做法:
利用set的特性,每次set.add()都会自动去重,如果多个数的重复次数一样,set.size的值会比原来的长度小,那么set.size和map.size不一样,这样也能证明每个数的出现次数是否是独一无二的
function uniqueOccurences(nums) {const map = new Map()for (let val of nums) {// 统计val出现的次数if (map.has(val)) {// 如果之前map存在这个数,则把这次val次数(1次)和 之前val次数相加map.set(val, map.get(val) + 1)} else {// 如果之前map里面不存在这个数,则只需要把这次val次数加上就行(1次)map.set(val, 1)}}let set = new Set();for (let [val, time] of map) {set.add(time)}return set.size === map.size;}console.log(uniqueOccurences([1, 2])) // falseconsole.log(uniqueOccurences([-3, 0, 1, -3, 1, 1, 1, -3, 10, 0])) // trueconsole.log(uniqueOccurences([1, 2, 2, 1, 1, 3])) // true