一、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() );
喜欢以上内容吗?欢迎访问主页喔