《前端老酒馆》陪你成为算法王的男人

46 阅读1分钟

1. 两数之和

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

示例:

输入:nums = [1,3,5,9], target = 8
输出:[1,2]
解释:因为 nums[1] + nums[2] == 8 ,返回 [1, 2] 

思考: 有没有能够存储下标和值的,同时又比较方便判断和存取的方法呢? 即 let map = new Map()

  1. 遍历数组中每一项,获取目标值与 nums[i] 的差值, 即 target - nums[i] = k
  2. 判断k值在map中是否存在,即map.has(k)如果为false, 即在map中存储该值及当前下标,即 map.set(nums[i], i),
  3. 继续往下遍历, 如果 map.has(k)true 即 返回之前存储的k对应的i 和 当前值的 i,
  4. 如果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]

思考:

  1. 遍历arr1的每一项数据,然后判断arr2中是否存在该元素,如果存在即返回。
  2. 这种情况可能存在多个值,那么再用[...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)
        }
    })
};