1

みんな、あなたの意見が必要です。以前のインタビュー中にこれに遭遇しました。質問を正しく理解し、正しく答えられたことを確認したいだけです。ありがとうございました。以下の質問と私の回答を確認してください。

入力一次元配列 [1,2,3,4] を取り、現在のインデックス [24,12,8,6] を除く整数の積を出力します。

//My answer
function calculate(values:Array):Array {
    var resultArray:Array = new Array();
    for(var i:int = 0; i < values.length; i++) {
        var getVal1:Number = 1;
        for(var k:int = 0; k <= values.length; k++) {
            if(i != k) {
                var getVal2:Number = values[k];
                getVal1 *= getVal2;
            }
        }
        resultArray.push(getVal1);
    }
    return resultArray;
}
4

5 に答える 5

4

ネストされたループは、非常に厄介な方法のようです。

比較的最新のブラウザ (IE 8 以前はリリース済み) または適切なシムを使用していると仮定します。

var resultArray = sourceArray.map(function(val,ind,arr) {
    arr = arr.slice(0); // create copy of array to work on here
    arr.splice(ind,1); // remove current item from array
    return arr.reduce(function(prev,curr) {return prev*curr;},1);
});

Array.prototype.map
Array.prototype.reduce

編集より効率的な別の方法を次に示します。

var product = sourceArray.reduce(function(prev,curr) {return prev*curr;},1);
var resultArray = sourceArray.map(function(val) {return product/val;});
于 2013-06-25T23:48:31.353 に答える
2

あなたのソリューションは正しい答えを与えますが、新しい配列を計算するためのはるかに効率的な方法があります:

function calculate(values:Array):Array {
    var resultArray:Array = new Array();
    var product:int = 1; 

    for(var i:int = 0; i < values.length; i++) {
        product *= values[i];
    }

    for(var i:int = 0; i < values.length; i++) {
        resultArray.push(product / values[i]);
    }

    return resultArray;
}

このソリューションにはO(n)実行時間がありますが、コードにはO(n²)実行時間があります。

于 2013-06-25T23:49:00.087 に答える
1

それはうまくいくはずです。最初にすべての項目を乗算することで、より簡単かつ効率的に行うことができます。

function calculate(values) {
  var prod = 1;
  for (var i = 0; i < values.length; i++) prod *= values[i];
  var result = [];
  for (i = 0; i < values.length; i++) result.push(prod / values[i]);
  return result;
}
于 2013-06-25T23:51:45.770 に答える
0

以下のコードは非常に読みやすいと思います。And にはネストされたループはありませんが、2 つの連続したループがあります。私の答えは次のとおりです。

function calculate(array){
    var total = array.reduce(function(a, b){
        return a * b;
    });

    return array.map(function(element){
        return total / element;
    });
}
于 2013-06-25T23:58:49.880 に答える
0

私は@Kolinkの短くて効率的な解決策が一番好きですが、タスクを解決する別の方法があります-除算を使用せずにO(n).

function calculate(values) {
    var acc = 1,
        l = values.length,
        result = new Array(l);
    for (var i=0; i<l; i++) {
        result[i] = acc;
        acc *= values[i];
    }
    acc = 1;
    while(i--) {
        result[i] *= acc;
        acc *= values[i]
    }
    return result;
}

または、同じことですが、少し難読化されています*:

function calculate(values) {
    var acc = 1,
        i = 0,
        l = values.length,
        result = new Array(l);
    if (l)
        result[i] = 1;
    while( ++i < l)
        result[i] = acc *= values[i-1];
    i -= acc = 1;
    while (i--)
        result[i] *= acc *= values[i+1];
    return result;
}

*: 省略形の演算子が好きです!

于 2013-06-26T00:03:03.117 に答える