题目

sum_of_n (or SequenceSum.sumOfN in Java) takes an integer n and returns a List of length abs(n) + 1. The List contains the numbers in the arithmetic series produced by taking the sum of the consecutive integer numbers from 0 to n inclusive.n can also be 0 or a negative value.(实在是翻译不出来)

Example:

5 -> [0, 1, 3, 6, 10, 15]

-5 -> [0, -1, -3, -6, -10, -15]

7 -> [0, 1, 3, 6, 10, 15, 21, 28]

我的解法:

function sumOfN(n) {
  var array = new Array();
  if (n >= 0) {
    for (var i = 1, sum = 0; i < n + 2; i++) {
      array.push(sum);
      sum = sum + i;
    }
  } else {
    for (var i =- 1, sum = 0; i > n - 2; i--) {
      array.push(sum);
      sum = sum + i;
    }
  }
  return array;
};

思路分析:依旧简单直接。题目给的例子用 array,那就返回 array。n 有正负,那就分类讨论。最后 sum = sum + i 完事。

来看别人怎么写:

插一句:觉得这个阶段(7kyu)的题思路很清(简)晰(单),差别在于方法的选择以及代码的优化。

解法一:

function sumOfN(n) {
  var arr = [],
      counter = 0;
  for (var i = 0; i <= Math.abs(n); i++) {
    arr.push(counter + i);
    counter += i;
  }
  return n >= 0 ? arr : arr.map(function(el) {return 0 - el});
};

解法二:

function sumOfN(n) {
  for (var i = 0, list = []; i <= Math.abs(n); i++) {
    list.push((list[i - 1] || 0) + i * (n < 0 ? -1 : 1));
  }
  return list
}

解法三:

function sumOfN(n) {
  return Array.apply(0, Array(Math.abs(n) + 1)).map(
    function(_, i) {
      return (n < 0 ? -1 : 1) * i * ( i + 1) / 2;
    });
};

分析:

解法一:不论 n 的正负,一律按照 n 的绝对值来处理,最后判断n的正负。若为负,则利用 map() 方法将数组元素遍历为负。

解法二:精彩!每次 push() 后,自动 push 下一个数组元素。(list[i - 1] || 0) 判断 n=0 的情况。

解法三:暂时还看不懂 T_T …….

还有很多解法,大同小异。这里是地址

以上。