【问题标题】:How to use array.push inside a function如何在函数中使用 array.push
【发布时间】:2019-06-16 12:52:03
【问题描述】:

我正在尝试将数组返回一个符合两个 if 语句的数字数组。提示来自 leet 代码“自除数”,它要求接受两个参数,一个下限和一个上限,并检查该范围内的每个数字是否可以被每个数字的数字整除。

当我 console.log(num) (注释掉的部分,我得到一个正确的数字列表,但不是数组格式。为了解决这个问题,我想在推送数组后添加一个变量、结果和返回结果结果在 for 循环中。但是,当我这样做时,我只能得到数组中的第一个正确项,而不是完整的数组。

如何解决这个问题?我尝试在不同的位置移动 return 语句,但这并没有解决问题。

函数应该返回 [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22];

function selfDividingNumbers(left, right) {

    for (let j = left; j <= right; j++) {
        let num = j;
        let result = []
        let strNum = num.toString();
        let dividingDigit = 0;

        for (let i = 0; i < strNum.length; i++) {
            if (num % parseInt(strNum[i]) == 0) {
                dividingDigit++;
            }
            if (dividingDigit == strNum.length) {
                result.push(num)
                //console.log(num)
            }
        }
        return result
    }
};

console.log(selfDividingNumbers(1, 22));

【问题讨论】:

  • 您需要将结果(声明和返回)移到 for 循环之外。

标签: javascript arrays algorithm


【解决方案1】:

根据您的预期输出,在函数的非常顶部定义result,然后仅在完全遍历两个循环后才返回:

function selfDividingNumbers(left, right) {
  let result = []
  for (let j = left; j <= right; j++) {
    let num = j;
    let strNum = num.toString();
    let dividingDigit = 0;

    for (let i = 0; i < strNum.length; i++) {
      if (num % parseInt(strNum[i]) == 0) {
        dividingDigit++;
      }
      if (dividingDigit == strNum.length) {
        result.push(num)
        //console.log(num)
      }
    }
  }
  return result
};

console.log(selfDividingNumbers(1, 22));

为了更简洁,你可以使用.filter检查.every的位数是否均分:

function selfDividingNumbers(left, right) {
  return Array.from(
    { length: right - left },
    (_, i) => i + left
  )
  .filter((num) => {
    const digits = String(num).split('');
    if (digits.includes(0)) {
      return false;
    }
    return digits.every(digit => num % digit === 0);
  });
}
console.log(selfDividingNumbers(1, 22));

【讨论】:

    【解决方案2】:

    当您在 for 循环中声明 let result = [] 时,您是在告诉您的代码在每次循环迭代时重新创建此数组,从而删除所有之前推入其中的结果。相反,您需要将其移到 for 循环之外以阻止这种情况发生。

    最后,只有在外部 for 循环完成后才需要 return,因为在 for 循环内返回将停止函数运行(从而停止循环)。

    请参阅下面的工作示例:

    function selfDividingNumbers(left, right) {
      let result = [];
      for (let j = left; j <= right; j++) {
        let num = j;
    
        let strNum = num.toString();
        let dividingDigit = 0;
    
        for (let i = 0; i < strNum.length; i++) {
          if (num % parseInt(strNum[i]) == 0) {
            dividingDigit++;
          }
          if (dividingDigit == strNum.length) {
            result.push(num)
          }
        }
    
      }
      return result
    };
    
    console.log(selfDividingNumbers(1, 22));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 2022-01-20
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 2014-05-07
      相关资源
      最近更新 更多