【问题标题】:Sum of Array of Odd numbers - JS奇数数组的总和 - JS
【发布时间】:2017-12-02 12:23:47
【问题描述】:

给定连续奇数的三角形:

1
3     5
7     9    11
13    15    17    19
21    23    25    27    29

// 从行索引(从索引 1 开始)计算这个三角形的行和 例如:

rowSumOddNumbers(1); // 1
rowSumOddNumbers(2); // 3 + 5 = 8

我尝试使用 for 循环来解决这个问题:

function rowSumOddNumbers(n){
  let result = [];

  // generate the arrays of odd numbers
  for(let i = 0; i < 30; i++){
    // generate sub arrays by using another for loop
    // and only pushing if the length is equal to current j
    let sub = [];
    for(let j = 1; j <= n; j++){
      // if length === j (from 1 - n) keep pushing
       if(sub[j - 1].length <= j){
         // and if i is odd
         if(i % 2 !== 0){
           // push the i to sub (per length)
           sub.push(i);
         }
       }
    }
    // push everything to the main array
    result.push(sub);
  }

  // return sum of n 
  return result[n + 1].reduce(function(total, item){
    return total += item;
  });
}

我上面的代码不起作用。基本上,我计划首先生成一个小于 30 的奇数数组。接下来,我需要根据从 1 - n(通过)的迭代长度(j)创建一个子数组。然后最后将其推送到主数组。然后使用 reduce 得到该索引中所有值的总和 + 1(因为索引从 1 开始)。

知道我缺少什么以及如何使其工作吗?

【问题讨论】:

  • 要理解为什么这不起作用,最好的办法是在调试器中单步执行代码,查看变量的值等。您的 IDE 中可能内置了一个(如果没有,请考虑查看另一个 IDE,例如 VS Code),在 Node 中有一个(它使用 Chrome 作为其 UI),当然在所有主要浏览器中也是如此。
  • 因为这大概是一个作业,我不会发布代码,但是:有一个戏剧性地更简单的方法来解决这个问题;根本不需要数组。给定行的第一个数字是n * (n - 1) + 1,当然该行的长度是n 奇数,所以一个短的for 循环或一些进一步的数学就可以了。

标签: javascript arrays


【解决方案1】:

大多数代码问题首先涉及一些分析,以便发现模式,然后您可以将其转换为代码。查看三角形,您会看到每一行的总和遵循一个模式:

1: 1 === 1 ^ 3
2: 3 + 5 = 8 === 2 ^ 3
3: 7 + 9 + 11 = 27 === 3 ^ 3
... etc

所以从上面的分析中你可以看到你的代码可能会稍微简化——我不会发布答案,但考虑使用Math.pow

【讨论】:

    【解决方案2】:

    不需要任何循环。

    function rowSumOddNumbers(n) {
        // how many numbers are there in the rows above n?
        // sum of arithmetic sequence...
        let numbers_before_n_count = (n - 1) * n / 2;
    
        let first_number_in_nth_row = numbers_before_n_count * 2 + 1;
        let last_number_in_nth_row = first_number_in_nth_row + 2 * (n - 1);
    
        // sum of arithmetic sequence again...
        return n * (first_number_in_nth_row + last_number_in_nth_row) / 2;
    }
    

    【讨论】:

    • 为明显的家庭作业(等)发布完整的重写代码解决方案是不合适的。 (不是我的 dv——啊,它被颠倒了)
    • @T.J.Crowder:所以最好让 OP 使用他的“坏”代码? (无意冒犯,Tony Beatty,每个人都曾经是初学者)如果我正在解决某个问题并需要帮助,我肯定会更感激最有效的解决方法,这样我就可以学到新的东西。 (并不是说我声称这是最有效的解决方案 - 随意提出任何改进建议 - 但它显然比使用循环更好。)
    • 它是为人做事,而不是帮助他们做事。
    • 你能进一步解释你的答案吗?使用上面在函数中传递的示例进行类比。
    猜你喜欢
    • 2016-07-05
    • 2013-08-14
    • 2020-10-03
    • 2022-11-18
    • 2013-08-03
    • 2018-10-04
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多