简体   繁体   中英

Sum of Array of Odd numbers - JS

Given the triangle of consecutive odd numbers:

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

// Calculate the row sums of this triangle from the row index (starting at index 1) eg:

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

I tried to solve this using for loops:

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;
  });
}

My code above is not working. Basically I was planning to 1st generate an array of odd numbers less than 30. Next I need to create a sub array base on the length of iteration (j) that would from 1 - n (passed). Then finally push it to the main array. And then use reduce to get the sum of all the values in that index + 1 (since the index starts at 1).

Any idea what am I missing and how to make this work?

Most code problems involve some analysis first in order to spot patterns which you can then convert into code. Looking at the triangle, you'll see the sum of each row follows a pattern:

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

So from the analysis above you can see that your code could probably be simplified slightly - I won't post an answer, but think about using Math.pow .

No need for any loops.

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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM