你会使用Map吗?每天学点JavaScript

82 阅读2分钟

一、map基础知识


二、相关题目

题目1:寻找重复数

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。 示例 1: 输入:nums = [1,3,4,2,2] 输出:2 示例 2: 输入:nums = [3,1,3,4,2] 输出:3 提示: 1 <= n <= 105 nums.length == n + 1 1 <= nums[i] <= n nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

         var findDuplicate = function (nums) {
            var mymap = new Map()
            // 遍历数组,得到一个mymap
            for (var k of nums) {
                // mymap.has(k) ? mymap.set(k, mymap.get(k) + 1) : mymap.set(k, 1)
                mymap.set(k, (mymap.get(k) || 0) + 1)
            }
            console.log(mymap)
            // 遍历mymap找出出现2次的数
             for (let [key, val] of mymap.entries()) {
                if (val == 2) return key;
            } 
            // for (let [key, val] of mymap) {
            //     if (val==2) return key;
            // }
        };
        var res = findDuplicate([1, 3, 4, 3, 2])
        console.log(res);

题目2:寻找字符串中第一个只出现1次的字符

在字符串s中找出第一个只出现一次的字符。若没有,返回一个单空格。s只包含小写字母。 示例 1: 输入:s = "abaccdeff" 输出:'b' 示例 2: 输入:s = "" 输出:' '

// **************************题2方法1*******************
        var firstUniqChar = function (s) {
            let map = new Map();
            // 1.统计每个字符出现的次数
            for (let i of s) {
                if (!map.has(i)) {
                    map.set(i, 1)
                } else {
                    map.set(i, map.get(i) + 1)
                }
            }
            // 2.返回出现次数为1的即可
            for (let i of s) {
                if (map.get(i) === 1) {
                    return i
                }
            }
            return ' '
        }; 

// **************************题2方法2*******************
         var firstUniqChar = function (s) {
            if (!s) { return " " }
            else {
                var obj = {}
                for (var k in s) {
                    //obj[s[k]] ? obj[s[k]]++ : obj[s[k]] = 1
                    // 方法2:
                    // obj[s[k]]=(obj[s[k]] || 0) + 1
                    //  方法3:
                    // 键值对应数没有值,赋1
                    if (obj[s[k]] == undefined) {
                        obj[s[k]] = 1;
                    } else {
                        // 有值,归零
                        obj[s[k]] = 0;
                    } 
                }
                for (var j in obj) {
                    while (obj[j] === 1) {
                        return j
                    }
                }
            };
        } 

        
// **************************题2方法3*******************
        var firstUniqChar = function (s) {
            var map = new Map();
            for (let i = 0; i < s.length; i++) {
                var cur = s.charAt(i);
                if (map.has(cur)) {
                    map.set(cur, false);
                } else {
                    map.set(cur, true);
                }
            }

            for (let [key, value] of map) {
                if (value) {
                    return key;
                }
            }
            return ' '
        }; 

题目3:寻找数组中出现最频繁的所有偶数中最小的那个

给你一个整数数组 nums ,返回出现最频繁的偶数元素。 如果存在多个满足条件的元素,只需要返回 最小 的一个。如果不存在这样的元素,返回 -1 。 示例 1: 输入:nums = [0,1,2,2,4,4,1] 输出:2 解释: 数组中的偶数元素为 0、2 和 4 ,在这些元素中,2 和 4 出现次数最多。 返回最小的那个,即返回 2 。 示例 2: 输入:nums = [4,4,4,9,2,4] 输出:4 解释:4 是出现最频繁的偶数元素。 示例 3: 输入:nums = [29,47,21,41,13,37,25,7] 输出:-1 解释:不存在偶数元素。

    <script>
        var mostFrequentEven = function (nums) {
            let arr = nums.filter((item) => item % 2 === 0)
            if (arr.length === 0) { return -1 }
            else {
                let mymap = new Map()
                for (let k of arr) {
                    mymap.set(k, (mymap.get(k) || 0) + 1)
                }
                console.log(mymap)
                let vals = Array.from(mymap.values());
                vals.sort((a, b) => b - a)
                // 获取最多的出现次数maxnum
                let maxnum = vals[0]

                let resarr = []
                for (let [key, value] of mymap) {
                    if (value === maxnum) {
                        resarr.push(key)
                    }
                }
                resarr.sort((a, b) => a - b)
                return resarr[0]
            }
        }
        // let res = mostFrequentEven([0, 1, 2, 2, 4, 4, 1])
        let res = mostFrequentEven([1,3,3,89,13,23])
        console.log(res); 
    </script>

三、分别获取map中的键与值

分别得到mymap中的键的数组、值的数组

let vals = Array.from( mymap.values());

let keys = Array.from( mymap.keys() );

喜欢以上内容吗?欢迎访问主页喔