题目来自leetcode

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum

求解

知识储备

字典 在js中的使用,添加map.set() , 查找map.has(), 获取map.get()

思路

target - nums[i] = num 字典中存入nums于num比对,相符就返回下标索引

实现白话:
定义实例Map()
然后循环遍历一次nums数组
循环中定义一个num 作为目标减去nums[i]
第一轮中map为空先在字典中加入nums[0] 用map.set()
第二轮中加入判断,看字典中是否存在相同数字,用map.has()
如果存在,输出字典中存储数字的下标和当前索引值。用map.get()
不存在就继续添加nums[1]
以此类推

var twoSum = function(nums, target) {
    let map = new Map()
    for ( let i=0; i<nums.length; i++){
        num = target - nums[i]
        if( map.has(num) ){
            return [map.get(num),i]
        }
        map.set(nums[i],i)
    }
};

349.两个数组交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

求解

知识储备

js中的Set() ,可以参考阮一峰ES6,这个是用来去除数组中的重复元素。[…new Set(变量)]
还有就是filter函数使用,arr.filter((val)=>执行函数)

思路

首先是数组中的重复元素得去掉,不去掉也行吧。用Set去除重复函数,然后用filter过滤掉

var intersection = function(nums1, nums2) {
    let set = new Set(nums2)
    return [...new Set(nums1)].filter((val)=>set.has(val))
};

1027.元素出现次数独一无二

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-number-of-occurrences

求解

知识储备

前面两题一样

思路

Map()和Set()中的区别吧,set不会添加相同数字,先用map一个个加进去,加入中出现相同元素的val就加1。然后用set遍历得到的map得到一个新的set,set和map比size,一样为真,否为假。

var uniqueOccurrences = function(arr) {
    let map = new Map()
    for( let item of arr){
        if ( map.has(item) ){
            map.set(item, map.get(item) + 1)
        }else{
            map.set(item,1)
        }
    }

    let set = new Set()
    for ( let [key,value] of map ){
        set.add(value)
    }
    return set.size == map.size

};