2017-05-04 6 views
2

コードウォールのチャレンジ(Simple Fun #237: Suffix Sums)で作業していますが、すべてのテストに合格するとタイムアウトエラーが発生します。課題は、指定された配列から新しい配列を作成することです。新しい配列の各インデックスは、オリジナルの同じインデックスと元の配列の最後の合計です。JavaScriptの "for"ループとarray.reduceでのタイムアウト/非効率エラー

配列 1, 2, 3, -6,については

出力は0, -1, -3, -6.

b[0]= 1 + 2 + 3 - 6 = 0 
b[1]=  2 + 3 - 6 = -1 
b[2]=   3 - 6 = -3 
b[3]=   - 6 = -6 

私のコードは、この

function suffixSums(a) { 
var res=[] 
for(i=0;i<a.length;i++){ 
    var newarray=a.slice([i]) 
    res.push(newarray.reduce(function(acc, val){ return acc + val },0)) 
    } 
    return res 
} 

まで何任意の手がかりであるべきか?私はまだ明らかに学習していますが、最適化は全く新しい世界です

+0

ヒント:最後に開始します。 – BPS

答えて

0

各項目の合計をゼロから計算するので時間が浪費しています。配列の最後から始めて、あなたは元の配列を変更してもかまわない場合

function suffixSums(a) { 
 
    var res = [], 
 
     sum = 0;        // sum of items from end to the current index (initialized with 0) 
 
    for(var i = a.length - 1; i >= 0; i--) { // loop from the end 
 
     sum += a[i];       // add the current number to sum 
 
     res[i] = sum;       // add the sum to the result array at index i (this line could be changed to: res.unshift(sum);) 
 
    } 
 
    return res; 
 
} 
 

 
console.log(suffixSums([1, 2, 3, -6]));

+1

恐ろしい!解説をいただきありがとうございます。デフォルトの思考は間違いなく右から左に、私にそれを切り替えるには発生していない – skdfsdfa

+0

あなたは大歓迎です! –

+0

@skdfsdfa左から右にすることもできますが、すべての要素から総和を引くだけです。 – Bergi

0

(Codewarsは気にしない):行く

function suffixSums(a) { 
for(var i = a.length - 2; i > -1; i--) 
    a[i] += a[i+1]; 
return a; 
} 
1

アイテムの後続を使用し、最後から反復しながら実際の値を追加することができます。

function suffixSums(a) { 
 
    var i = a.length - 1; 
 
    while (i--) { 
 
     a[i] += a[i + 1]; 
 
    } 
 
    return a; 
 
} 
 

 
console.log(suffixSums([1, 2, 3, -6]));

+1

うーん、結果は正しいですか? – Redu

+0

@Redu、ちょうどタイプミス。ヒントのおかげで。 –

0

私はこの仕事が好きだろう。

var arr = [1, 2, 3, -6], 
 
    res = arr.reduceRight((r,n) => r[0] === void 0 ? [n] : [n+r[0]].concat(r),[]); 
 
console.log(res);

関連する問題