210407.Today I学習(TIL):対象COPLET 21パス


Object Copletsの最後のエンドボード王問題を解いてみましょう.数日続けてテスト用例、デバッガ、公式をリノベーションし、何度も繰り返し書きましたが、最終的には10個のテストのうち8個がテストに合格したので、これが一番いい選択なので、レポートを見てから勉強することにしました.まず、私のコードのいくつかの大きな問題を指摘したいと思います.
<オブジェクトコピー21番>
質問:文字列を受信して、最も繰り返し頻度の高い文字(アルファベット)を返します.
入力:
パラメータ1 str:stringタイプにスペースがある文
出力:
戻りstringタイプ
注意事項:
  • にはスペースは含まれていません.
  • 繰り返し頻度が最も高い文字数が
  • の場合は、その回数に達した文字を最初に返さなければなりません.
  • の空の文字列が受信された場合は、空の文字列を返す必要があります.
  • まず、私の最終コードは次のとおりです.
    function mostFrequentCharacter(str) {
      if(str.length === 0 || str === ' ') {
        return '';
      }
    
      let obj = {};
      for(let i = 0; i < str.length; i++) {
       if(obj[str[i]] === undefined) {
         obj[str[i]] = 0;
       }
       obj[str[i]]++
      }
    
       let arr = Object.entries(obj);
       let emp = [];
       let result = 0;
       for(let f = 0; f < arr.length; f++) {
         if(arr[f][0] !== ' ' && arr[f][1] > result) {
           result = arr[f][1];
           emp.push(arr[f][0]);
         }
       }
       return emp[emp.length-1];
     }
    テスト用例ダンプ方式でコードを記述するため,コードはかなり乱雑である.最初の条件文に、その空の文字列が入力された場合にインスタンスを上書きしますが、スペースが入力された場合は上書きされません.デバッガが振り返ると、上のコードも最初の条件文で選択され、空の文字列を返すことに成功しました.不思議なことに、テストケースが合格しませんでした.しかし、このコードはそれ以外にも全面的に修正する必要があるところが多いので、その部分は優先度を後ろに置いてから、最初から見ます.
    次はリファレンスコードです.
    function mostFrequentCharacter(str) {
      let obj = { mostCount: 0, mostFrequent: '' };
      for (let i = 0; i < str.length; i++) {
        if (str[i] === ' ') {
          continue;
        }
    
        if (obj[str[i]] === undefined) {
          obj[str[i]] = 0;
        }
        obj[str[i]] += 1;
    
        if (obj[str[i]] > obj['mostCount']) {
          obj['mostCount'] = obj[str[i]];
          obj['mostFrequent'] = str[i];
        }
      }
      return obj['mostFrequent'];
    }
    コードロジックが完全に間違っているというより、細部に大きな違いがあります.順番に見ると、以下の違いがあります.

  • 私が書いたコードは、オブジェクトにスペースを入れる必要がなく、2番目の繰り返し文で条件として除外されます.逆に、リファレンスコードはcontinue構文を使用して、重複文を使用してオブジェクトを作成したときにスペースをスキップし、キーを生成します.私は複文の中でまだ「continue」と「break」に慣れていないので、この方法を考える暇がなかった.最初から空白を消してオブジェクトを作成すると、後の演算がかなり簡潔になります.

  • 私のコードでは、オブジェクトはオブジェクトであり、オブジェクトの属性値を比較する過程で、インデックスでアクセスしたい考えに基づいてオブジェクトをキーと値のペアの配列に並べます.entries()メソッドを使用し、referenceコードでは、オブジェクトの作成から空でないオブジェクトの任意のキー(mostCount,mostFrequent)とその対応する値を初期値として宣言し、条件に従ってキーの値を再割り当てします.最終的な記述コードを記述する前に、複数の試行エラーでオブジェクトの値、すなわち数値を比較する必要があり、文字列を返す必要があるという問題を返すのは頭が痛い.私の知っている要領では、値に対応するキーを順番に新しい配列に入れて、その配列の最後の要素を返すように返して、いくつかのテストケースに合格しましたが、そうすると、すべての状況の数を上書きできないので、あまり良いコードではありません.この問題は10個のテストケースしかありませんが、この問題のテストケースが数十個あれば、半分は合格しなかったかもしれません.

  • 私のコードは、「最大重複文字数が多数であれば、最初にその回数に達した文字を返す」という条件を満たすことができません.いずれにしても、他の2つの重複文を使用し、オブジェクトを配列に変換してインデックスを使用してアクセスするため、「先頭の文字」のみが返され、「最初に到着した文字」は返されません.referenceコードでは、1つの重複文にオブジェクトを作成しながら、予め宣言された「mostCount」と「mostFrequent」の値を再割り当てすることで、「最初に到着した文字」を返すことができます.
  • この問題では、重複文でcontinue構文を使用する方法を学び、オブジェクトキーと値にアクセスする新しい方法を把握できます.