1. 两数之和
描述
:给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
示例:
输入:nums = [1,3,5,9], target = 8
输出:[1,2]
解释:因为 nums[1] + nums[2] == 8 ,返回 [1, 2]
思考: 有没有能够存储下标和值的,同时又比较方便判断和存取的方法呢? 即 let map = new Map()
- 遍历数组中每一项,获取目标值与
nums[i]
的差值, 即target - nums[i] = k
- 判断
k
值在map
中是否存在,即map.has(k)
如果为false
, 即在map中存储该值及当前下标,即map.set(nums[i], i)
, - 继续往下遍历, 如果
map.has(k)
为true
即 返回之前存储的k
对应的i
和 当前值的i
, - 如果nums中没有满足条件的值, 即返回
[]
代码实现:
function result(nums, target) {
// 1.创建map集合
let map = new Map()
// 2.遍历数组中的每一项
for(let i = 0; i < nums.length; i++) {
// 3. 每次遍历存储当前遍历的差值,并存储在map集合中,并且判断集合中是否有满足条件的值
let k = target - nums[i]
// 4. 如果满足说明找到了,即返回即可
if (map.has(k)) {
return [map.get(k), i]
}
// 5. 没找到那就存起来,方便下次判断, 值为key,下标为value
map.set(nums[i], i)
}
// 6. 如果没有该值即返回[]
return []
}
2. 给定两个数组,编写一个函数来计算它们的交集
描述
: 给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例:
输入:arr1 = [1,2,2,1], arr2 = [2,2]
输出:[2]
输入:arr1 = [6,9,8], arr2 = [5,3,7,8,9]
输出:[8,9]
思考:
- 遍历arr1的每一项数据,然后判断arr2中是否存在该元素,如果存在即返回。
- 这种情况可能存在多个值,那么再用
[...new Set()]
进行去重
代码实现:
function result (arr1,arr2) {
return [...new Set(arr1.filter(item => arr2.includes(item)))]
}
其他方法实现: 思考一下。为什么呢?
function result (arr1, arr2) {
let map = {}
return arr1.filter(item => {
if(!map[item] && arr2.includes(item)){
map[item] = true
return arr2.includes(item)
}
})
};