This commit is contained in:
Ilya Kantor 2014-11-16 01:40:20 +03:00
parent 962caebbb7
commit 87bf53d076
1825 changed files with 94929 additions and 0 deletions

View file

@ -0,0 +1,12 @@
function getSums(arr) {
var result = [];
if (!arr.length) return result;
var totalSum = arr.reduce(function(sum, item) {
result.push(sum);
return sum + item;
});
result.push(totalSum);
return result;
}

View file

@ -0,0 +1,18 @@
describe("getSums", function() {
it("частичные суммы [1,2,3,4,5] равны [1,3,6,10,15]", function() {
assert.deepEqual( getSums([1,2,3,4,5]), [1,3,6,10,15]);
});
it("частичные суммы [-2,-1,0,1] равны [-2,-3,-3,-2]", function() {
assert.deepEqual( getSums([-2,-1,0,1]), [-2,-3,-3,-2]);
});
it("частичные суммы [] равны []", function() {
assert.deepEqual( getSums([]), [] );
});
it("частичные суммы [1] равны [1]", function() {
assert.deepEqual( getSums([1]), [1] );
});
});

View file

@ -0,0 +1,47 @@
Метод `arr.reduce` подходит здесь идеально. Достаточно пройтись по массиву слева-направа, накапливая текущую сумму в переменной и, кроме того, добавляя её в результирующий массив.
Неправильный вариант может выглядеть так:
```js
//+ run
function getSums(arr) {
var result = [];
if (!arr.length) return result;
arr.reduce(function(sum, item) {
result.push(sum);
return sum + item;
});
return result;
}
alert(getSums([1,2,3,4,5])); // результат: *!*1,3,6,10*/!*
```
Перед тем, как читать дальше, посмотрите на него внимательно. Заметили, в чём ошибка?
Если вы его запустите, то обнаружите, что результат не совсем тот. В получившемся массиве всего четыре элемента, отсутствует последняя сумма.
Это из-за того, что последняя сумма является результатом метода `reduce`, он на ней заканчивает проход и далее функцию не вызывает, поэтому она оказывается не добавленной в `result`.
Исправим это:
```js
//+ run
function getSums(arr) {
var result = [];
*!*var totalSum*/!* = arr.reduce(function(sum, item) {
result.push(sum);
return sum + item;
});
*!*result.push(totalSum);*/!*
return result;
}
alert(getSums([1,2,3,4,5])); // *!*1,3,6,10,15*/!*
alert(getSums([-2,-1,0,1])); // *!*-2,-3,-3,-2*/!*
```

View file

@ -0,0 +1,23 @@
# Массив частичных сумм
[importance 2]
На входе массив чисел, например: `arr = [1,2,3,4,5]`.
Напишите функцию `getSums(arr)`, которая возвращает массив его частичных сумм.
Иначе говоря, вызов `getSums(arr)` должен возвращать новый массив из такого же числа элементов, в котором на каждой позиции должна быть сумма элементов `arr` до этой позиции включительно.
То есть:
```js
для arr = [1,2,3,4,5]
getSums(arr) = [1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5] = [1, 3, 6, 10, 15]
```
Еще пример: `getSums([-2,-1,0,1]) = [-2,-3,-3,-2]`.
<ul>
<li>Функция не должна модифицировать входной массив.</li>
<li>В решении используйте метод `arr.reduce`.</li>
</ul>