完走していない選手


問題の説明


多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前と完走した選手の名前の並びが完成したら、完走していない選手の名前を返す解決関数を書いてください.

せいげんじょうけん

  • マラソンに出場する選手は1人以上10万人以下.
  • 完了長さは参加者長1より小さい.
  • 参加者の名前は20文字を超えない.
  • の参加者には同名の人がいる可能性があります.
  • I/O例



    作成されたコード

    function solution(participant, completion) {
            
        /*
        	participant, completion을 정렬한다.
            정렬한다면 순서대로 정렬이 되어있으므로 idx마다 비교를 하고 값이 같지 않다면 명단에서 빠진 것
        */
        
        let answer = '';
        participant.sort()
        completion.sort()
        for (let i = 0; i < participant.length; i++) {
          if (participant[i] !== completion[i]) {
            answer = participant[i];
          break;
          }
        }
        
        return answer;
    }
  • ビットコードは精度テストに合格したが、効率テストには合格しなかった.当初はindexOfで比較しようとしたが,indexOfも重複するコードであることが分かった.そこでindexOfを削除し,直接比較した.indexOfでもっと効率的になると思ったのは間違いでした.よいことを学んだ
  • リファレンスコードと分析

    function solution(participant, completion) {
       completion.map(name => completion[name] = (completion[name] | 0) + 1);
        //completion[name] 이 존재한다면 completion[name] = completion[name] + 1
                             //존재하지 않는다면 completion[name] = 0 + 1;
       return participant.find(name => !completion[name]--); 
    }

  • 新しく知り合った場所.
  • JavaScriptでは配列のタイプがオブジェクトなので、Obj[key]を使って面配列にアクセスできます!

  • この部分と論理演算子を用いて、完了時に[key, value]として配列に値を入力する.
    let arr = ['eden', 'kiki', 'kiki'];
    arr.map(name => arr[name] = (arr[name] | 0) + 1)
    console.log(arr);// ["eden", "kiki", "kiki", eden: 1, kiki: 2]
    

  • 上のコードのようにコンソールで直接検索すると、既存の配列要素が含まれており、オブジェクトのkey、valueとして値が追加されます.

  • すなわち、completion[name]が存在する場合、転送コードはcompletion[name] = completion[name] + 1であり、存在しない場合、completion[name] = 0 + 1;である.
    そしてfalsy(0,fasle,Nan,null,undefined...)使用タイプcompletion[name]が0より大きい場合、真の値であるため、!completion[name]--は偽であり、最後に1が減少する.findは配列内の要素を巡回するので、要素を繰り返すと同時にtrue、すなわちcompletion[name] === 0で要素を返すと、未完了の人を見つけることができる.