私はコーディングにかなり新たなんだと、毎日のコーディング問題メーリングリストのために入隊し、この質問を得ました:
番号のリストと数kを考えると、リストから任意の2数をkまで追加するかどうかを返します。
(いくつかのstackoverflowの掘削後の)私のソリューションは、このようになります。
function problemOne_Solve()
{
const k = 17;
const values = [11, 15, 3, 8, 2];
for (i=0; i < values.length; i++) {
if ( values.find( (sum) => { return k-values[i] === sum} ) ) return true;
}
return false;
}
それが動作する理由私は思ったんだけど。脂肪矢印機能を持つ部分はif文の条件付きロジック内のブラケットを閉じたように私には見えます。そして、そのようなブラケットは、私が必要だったと思ったif文、後はありません。
また、私は解決策にさらに構築する「K」までの合計ペアまたはペアを出力について行くだろうかと思いまして。私は、例えばページ上のペアを表示できるようにしたいと思います。
.find
(一致が発見されるまで、または)アレイ内のすべての項目のために呼び出されるコールバックを取ります。コールバックの最初の引数は繰り返し処理されているアイテムです。(コールバック関数からの戻り値は、任意の要素のtruthyた場合)、一致が見つかった場合、.find
truthy戻り値が得られた項目を返します。
だから、最初にi = 0
反復、およびvalues[i]
され11
、(sum) => { return k-values[i] === sum}
最初のかどうかを確認します17 - 11 === 11
、その後、どうか17 - 11 === 15
、そしてどうか17 - 11 = 3
、など
配列内の2つの数字は、最大追加する場合、この条件は、一般的に満たされますk
が、アルゴリズムはバグがあります。例えば、から成るアレイが[1]
2まで追加、最初の反復でそれ自体に対して1を確認します。
function problemOne_Solve() {
const k = 2;
const values = [1];
for (i=0; i < values.length; i++) {
if ( values.find( (sum) => { return k-values[i] === sum} ) ) return true;
}
return false;
}
console.log(problemOne_Solve());
それは間違いです。もう一つの問題は、ある.find
戻った値。アレイは数字の配列である場合は、見つかった値が0であってもよく、0がfalseyあります。たとえば、以下のように、返すべきであるtrue
二つの要素が0(0 0)にまとめるので、それが返されますfalse
:
function problemOne_Solve() {
const k = 0;
const values = [0, 0];
for (i=0; i < values.length; i++) {
if ( values.find( (sum) => { return k-values[i] === sum} ) ) return true;
}
return false;
}
console.log(problemOne_Solve());
右のそれを取得するにしてから、計算の複雑さを減らすO(n ^ 2)
にO(n)
配列を反復、いったん。そのキーの上に反復される数であるオブジェクトを作成し、各反復でのキーがかどうかを確認しtarget - currNum
(オブジェクト上に存在するtarget
標的の和であり、currNum
アレイからの現在の数です)。
function problemOne_Solve() {
const target = 17;
const values = [11, 15, 3, 8, 2];
const obj = {};
for (const currNum of values) {
if (obj.hasOwnProperty(target - currNum)) {
return true;
}
obj[currNum] = true;
}
return false;
}
console.log(problemOne_Solve());
また、私は解決策にさらに構築する「K」までの合計ペアまたはペアを出力について行くだろうかと思いまして。私は、例えばページ上のペアを表示できるようにしたいと思います。
代わりに一致が見つかった場合、直ちに返す、アレイにプッシュし、次に関数の終了時にその配列を返します。また、代わりにオブジェクト値を設定するtrue
(またはfalse
)、数はこれまでに見つかった(そして一致が見つかった場合、一致する数をデクリメント)された発生数にそれらを設定します。
function problemOne_Solve() {
const target = 17;
const values = [11, 15, 3, 8, 2, 17, 0, 0, 17];
const obj = {};
const matches = [];
for (const currNum of values) {
const otherNum = target - currNum;
if (obj[otherNum]) {
obj[otherNum]--;
matches.push([currNum, otherNum]);
}
obj[currNum] = (obj[currNum] || 0) + 1;
}
return matches;
}
console.log(problemOne_Solve());
そして、そのようなブラケットは、私が必要だったと思ったif文、後はありません。
単一の文があるとき括弧は必要ありません後if
(またはelse if
またはelse
)、例えば:
if (true) console.log('true');
else console.log('this will not log');