前端算法-独一无二的出现次数

136 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

题目

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false

输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。

题解

先声明一个flag变量代表了最后返回出去的结果,默认是false,根据题意要求我们需要确认当前数组中每个数值出现的次数都是独一无二的,所以先对数据出现次数进行统计,声明一个map变量,它是一个Map数据结构,我们将arr变量出来里面的数值出现的次数全部放在map变量中去统计,然后使用循环出参arr变量,在循环中使用Map数据结构的has方法进行判断当前的循环中的值是否在map变量中,如果在则通过Map数据结构的get方法获取到当前值进行+1,然后在使用Map数据结构的set方法对修改后的值进行更新,如果没有循环的值不存在map变量中,则把当前的值作为key,value设置为1,因为时第一次出现的,value是出现的次数,我们声明一个set变量,它是一个Set数据结构,利用它有去重的特性,我们去循环map变量,将map变量中的value值通过Set数据结构的add方法添加到set变量中,然后判断当前set变量的长度和map变量的长度是否相等,如过相等则将flag变量改为true,如果不相等则不对flag变量做任何操作,最后将flag返回出去即可

/**
 * @param {number[]} arr
 * @return {boolean}
 */
var uniqueOccurrences = function(arr) {
            let flag = false;
            const map = new Map();
            for (const item of arr) {
                if (map.has(item)) {
                    let total = map.get(item) + 1;
                    map.set(item, total);
                } else {
                    map.set(item, 1);
                }
            }
            const set = new Set();
            for (let [key, value] of map) {
                set.add(value)
            }
            if (set.size == map.size) {
                flag = true;
            }
            return flag;
};

坚持努力,无惧未来!