【问题标题】:Filter returns first element of array instead of过滤器返回数组的第一个元素而不是
【发布时间】:2022-01-12 01:23:22
【问题描述】:

我正在为二和leetcode 问题实现哈希映射。

const testArrs = {
    'first': [2,7,11,15],
    'second': [3,2,4],
    'third': [3,3]
}

function twoSum(nums, target) {
    let mapped = nums.map((item) => target - item);
    let returnedArr = mapped.filter((item) => {
        if (nums.includes(item)) {
            console.log(nums.indexOf(target-item))
            return nums.indexOf(target - item)
        }
    })

    console.log(returnedArr)
    //TODO check if returnedArr size == 2.

}

twoSum(testArrs['first'], 9)

第一个数组mapped 创建一个哈希数组作为“索引”,它们是目标与nums 数组中每个元素的差异。然后我对映射数组应用过滤器以查看映射数组的 2 个元素是否包含在 nums 数组中,并返回这些元素的索引。

当索引被过滤到 returnedArr 时,它似乎返回 nums 的第一个元素而不是两个索引。 [2] 而不是 [0,1] 返回之前的日志显示它分别正确地注册了索引 0 和 1。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    那是因为您将过滤器与地图功能混合在一起。 map 函数必须返回一个布尔值(它将创建一个符合条件的目标数组)。并且,在获得这些值之后,在你的情况下,那些包含在 nums 中的值,你映射它们以获取它们的索引。 像这样:

    const testArrs = {
        'first': [2,7,11,15],
        'second': [3,2,4],
        'third': [3,3]
    }
    
    function twoSum(nums, target) {
        let mapped = nums.map((item) => target - item);
        let returnedArr = mapped.filter((item) => {
            return nums.includes(item)
        })
        return returnedArr.map((item)=> nums.indexOf(target-item))
    
    }
    
    console.log(twoSum(testArrs['first'], 9))`
    

    【讨论】:

      【解决方案2】:

      如果index0,则基本上return nums.indexOf(target - item) 结果为false。相反,您需要检查nums.indexOf(target - item) >= 0

      但是,Array#filter 并不是您真正想要的:

      filter() 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

      相反,您需要使用 Map 来保存数字索引对,然后检查 Map 中是否有补码:

      function twoSum(nums, target) {
        const map = new Map();
        for (let i = 0; i < nums.length; i++) {
          map.set(nums[i], i);
        }
        for (let i = 0; i < nums.length; i++) {
          const complement = target - nums[i];
          if (map.has(complement) && map.get(complement) != i) {
            return [i, map.get(complement)];
          }
        }
      }
      
      const testArrs = { 'first': [2,7,11,15], 'second': [3,2,4], 'third': [3,3] };
      console.log( twoSum(testArrs['first'], 9) );

      一种更快的方法是在一次迭代中完成:

      function twoSum(nums, target) {
        const map = new Map();
        for (let i = 0; i < nums.length; i++) {
          const complement = target - nums[i];
          if (map.has(complement)) {
            return [map.get(complement), i];
          }
          map.set(nums[i], i);
        }
      }
      
      const testArrs = { 'first': [2,7,11,15], 'second': [3,2,4], 'third': [3,3] };
      console.log( twoSum(testArrs['first'], 9) );

      【讨论】:

      猜你喜欢
      • 2021-10-04
      • 2021-12-29
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多