問題に対する最も速い解決策、および他の間違いを見つける


私は、2009年のヘルプチャンネルを経験していましたTPH 私はいつものように、この質問がポップアップすると、私は助けることができる質問を探しています

彼らがコンソールを間違って使っているように見えます.そして、確かに、それはまさに起こったことです.

それで、彼らの問題は解決しました、そして、私はスクロールしました、しかし、何かがちょうど彼らのコードについて少し離れているようでした.私は、コードが実際に何をするかを彼らに尋ねました、そして、彼らはこれを私に送りました:

Given a fixed-length integer array arr, duplicate each occurrence of zero, shifting the remaining elements to the right.


かなり簡単な質問、右?よく正確に.これを達成するために、複数の方法があります.そして、心に浮かぶ最初のものは、おそらく最も理想的なものではありません.
これを解決する方法を見てみましょう.

特定のインデックスに新しい要素を追加する


これは、我々の仲間プログラマが従うことを選んだ解決策です.
これは元のものと同じ長さの新しい空の配列を作成し、forループを使用して配列のインデックスに新しい要素を追加しますが、ゼロの場合は2つのゼロを追加し、インデックスをスキップします.
const array = [1, 0, 2, 3, 0, 4, 5, 0];
const temp = new Array(arr.length);
let tempIndex = 0;

for (let i = 0; tempIndex < array.length; i++) {
  if (arr[i] === 0) {
    temp[tempIndex] = 0;
    temp[tempIndex + 1] = 0;
    tempIndex++;
  } else {
    temp[tempIndex] = arr[i];
    tempIndex++;
  }
}

return temp;
このコードはうまく機能しますが、2つの主要な欠陥があります.

  • 読みやすさ:コードが何が起こっているかに本当に近い注意を払うことなく何をするかについて、あなたは理解することができません.

  • メンテナンス:インタビュアーが彼らにコード変更をするよう頼んだかどうか1 ではなく0 ? または1 and 5 ? 0を含む4行を変更しなければならず、コードをコピーして5にします.
  • 明らかに、一時的な配列+ループはこれで十分ではありません.単純な問題のために仕事が多すぎる.
    削除することによってコードをリファクタリングすることができますtempIndex 部分
    const array = [1, 0, 2, 3, 0, 4, 5, 0];
    const temp = [];
    
    for (let el of array) {
      if (el === 0) {
        temp.push(0);
        temp.push(0);
      } else {
        temp.push(el);
      }
    }
    
    return temp;
    
    我々も使用することができますconcat プッシュの代わりに1行を減らす
    - temp.push(0);
    - temp.push(0);
    + temp.concat([0, 0]);
    
    しかし、今、我々が来ているところを見て、我々は簡単な問題で始めました.そして、すぐにあまりに複雑であることがわかりました、そして、現在、我々は解決策を改善しようとしている時間のトンを費やしています.
    場合は、ユーザーが良いソリューションをオフに開始されましたか?
    これは私にこのポストのトピックをもたらします:問題解決は、最も速い解決を見つけることを意味しません.

    問題解決、それは何を意味しますか?


    私の意見では、問題解決は、あなたのチームと複数のソリューションを比較して、あなたがコードの1行を書く前に最も理想的なものを見つけることです.
    我々の仲間プログラマは、彼らの心に来て、それに取り組んだ最初の解決について考えました.彼らは長い時間の問題解決を費やしていた場合、彼らはちょうど適切なソリューションを思い付いているかもしれないし、助けを求めるために必要さえありませんでした.

    問題解決の一例


    あなたのチームが問題を与えられて、解決策を見つけなければならないシナリオを想像してください.制限時間がなく、すべての上司が探している解決策は以下の通りです.
  • 読みやすい.
  • 簡単にメンテナンスし、何かを壊すことなく新しいものを行うために更新することができます.
  • 可能なコードの最も少ない行で書かれます.
  • あなたとあなたのチームはコーヒーテーブルに座って、ブレーンストーミングを開始します.一人の男は可能な解決策を提案するので、チームは上司が尋ねたものに反対する解決策で問題を見つけようとします.あなたは問題を見つけて、働くことができた次の解決に進みます.
    解決策を比較するいくつかの時間の後、あなたは最終的に上司の要件に一致するものを思い付く.
    最後に、コードにソリューションを有効にし、プロモーションを得る🎉.

    しかし、これは現実の生活ではない


    それが良いものでないとしても、すでに存在するとき、最高の解決を見つけるために、時間のより大きな浪費のように思えます.それは仕事が速く行われることを得ます.そして、それは解決が最高であるという誤った印象を与えます.
    ときに最初にリリースされた、反応の仮想DOMは、業界のゲームチェンジャーだった.しかし、それ以来、反応は、それがゼロから始める方がよいとしても、VDOMからほんの少しのパフォーマンスを押し込もうとしていました.
    そして、Svelteが出てきたとき、それは仮想DOMを全く使わなかったので、これまで最速のフレームワークでした.
    問題解決のこの原則を我々の配列問題に適用しましょう.
    配列の要素を突然変異する一般的な方法は何ですか?map and reduce .
    しかし、マップはインデックスの要素だけを置き換えることができます.Reduceは良い解決策のようですが、試してみる前に他の解決策を見つけましょう.
    「しかし、待って、あなたもできますflat 配列."

    理想解


    私が思い付いたこの一行の解決策は、最も簡単で、最短の1つでした.
    array.map(num => num === 0 ? [0, 0] : num).flat();
    
    代わりに0 2つのゼロの配列でflat 配列がsの場合、入れ子状配列が実際のゼロになります.
    まだこれを改善する方法がありますflatMap 地図の代わりに、最後に余分なフラットを取り除くことができます.
    array.flatMap(num => num === 0 ? [0, 0] : num);
    

    結論


    あなたが誤ってそれを解決する場合、単純な問題は複雑に複雑になることができます.より多くの時間の問題を解決するコードを書くよりも、それは時間を何かを行うために必要な量を増やすことができる一方、それは長期的にあなたとあなたのチームに役立ちます.
    それで、今日のポストを終わります.私は将来的にこれのような記事を書くことを計画しています、それで、あなたにはこのポストについて言う何かを持っているならば、それがFormアルゴリズムで私のポストを押し上げるので、下記にコメントしてください.
    アディオス👋