[プログラマー/Javascript]20完走していない選手


問題の説明
多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前の並びparticipantと完走した選手の名前の並びcompletionを与える場合は、完走できない選手の名前を返すためにsolution関数を作成してください.
せいげんじょうけん
  • マラソンに参加する選手は100000人以上である.
  • completionの長さはparticipantの長さ1より小さい.
  • 参加者の名前には、少なくとも20文字の小文字が含まれています.
  • 参加者は同名である可能性がある.
  • I/O例
    participantcompletionreturn["leo", "kiki", "eden"]["eden", "kiki"]"leo"["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
    に答える
    初稿
    function solution(participant, completion) {
        completion.forEach((a)=>{
          participant.splice(participant.indexOf(a),1) 
          // participant내 a값의 인덱스 번호에서 부터 1개를 잘라낸다.
        })
        return participant[0]
    }
    .forEach()のようにcompletionを回転させ、participant内の一致値を.splice()に切り取る.そうなると同名の人がいても個々にカットするしかないので問題のない解答だと思い、コード実行でもうまくパスできました.しかし、コミット後にタイムアウトが見つかりました.
    *時間の複雑さ:問題解決に要する時間と入力した関数の関係で、「演算の回数」(実行回数)が計算されます.
    調べてみると、.forEach()ゲートがこの問題を解決し、時間の複雑さが高く、タイムアウトが発生します.どうやって解くか分からないので、髪を束ねて、簡単な方法ができることに気づきました.
    再送信された回答
    function solution(participant, completion) { 
        participant.sort() 
        completion.sort() // 두 배열 모두 사전순으로 정렬
        for(let i = 0; i < participant.length; i++){
            if(participant[i] !== completion[i]){ 
                return participant[i] // 인덱스 순으로 비교하다 일치하지 않을 시 return
            }
        }
    }
    説明:participantおよびcompletionの2つの配列は、いずれも辞書順に.sort()に配列されている.その後、対応するインデックス間で比較を行うと、一致しないと返されます.
    単純で立派な草ですが、虚無の心の中で他にない草を探しています.この過程で何かを見つけたので、もう少し残したいです.
    他人の解答
    var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
    これはいったい何ですか.正規分布式ですか?どうして糸が解けますか.考えながらコメントを見ていると実はこの答えは
    var solution=(participant,completion)=>participant.find(name=>!completion[name]--,completion.map(name=>completion[name]=(completion[name]|0)+1))
    このコードの変数名はminifyです.しかしこのように見ても理解できないことが多く、ちょうどコメントに親切な解釈(?)誰かがこの本を書いたので、内容を整理したいです.
    1
    最初はparticipant.find(콜백함수,콜백함수에 this로 사용될 객체)の2つのパラメータで、後の関数はコールバック関数より先に実行されます.ここでコールバック関数が果たす役割を見てみると、実際には、元の.map()は通常、現在処理する要素をパラメータとして受け入れ、コールバック関数を順番に実行して新しい配列を返すが、実際にはここから返される配列には特に意味はない.さらに重要なのは、.map()関数が最初に実行されることです.つまり、読みやすさの良い方法で前に抜き出して整理するなら、
    var solution = (participant,completion) => { 
      completion.map(name => completion[name] = (completion[name]|0)+1) 
      return participant.find((name) => !completion[name]--)
    }
    2
    では、.map()のキャラクターを見てみましょう.ここで、namecompletionの各要素を表し、completion[name](=)を定義することによって疑問が生じる.completion[name]=「このようにキー割り当て値は辞書で行われ、completionは配列ですが、これはどのようにして行われますか?レビューを読んで一番不思議なのはこの部分ですが、実はJavaScriptの並びが対象です.実際には、配列をtypeofと確認すると、'object'が表示されます.したがって、dictionaryに示すようにkeyを定義してvalueを割り当てることで、配列にも以下の内容が含まれていることがわかります.
    let fruit = ['apple','grape','banana']
    console.log(typeof fruit) // 'object'
    fruit['apple'] = 3
    console.log(fruit) // ['apple','grape','banana', apple: 3]
    
    したがって、上記のcompletion[name] = (completion[name]|0)+1は、completionオブジェクトのうちnameというkeyのvalueを定義しており、completionオブジェクトの中にnameというkeyのvalueが既に存在していれば、その値がなければ0を吐き出し(OR文)、さらに1を加えたものと理解できる..map()が回転した後、completionで操作を完了し、前はString、後ろはkey-valueペアである.
    3
    では、.find()を見てみましょう.まず、.find()は、条件の中でtrueの最初の要素returnである.では、どのような場合trueでしょうか.completion[name]は、その名前の個数を取得します.でもここに!後の値を「boolean」に変更します.逆も同様です.!truefalseが表示されます.すなわち、valueが1であれば!1である.逆に、false!0である.JavaScriptでは、trueの値が7つあります(falsefalse0-0NaNnullundefined):だからtrueになります.次に--,削減1を「後置」とする.この場合、completion[name]の値は1または0であり、undefined1の後にfalseが削除され、同名1が発生すると0が削除される.元のtrueに値が存在しない場合、completionが現れても、その値はundefinedになり、最終的にキー値が返されます.余談trueに接尾辞を付けると、キーと値が生成され、valueはundefinedで並べられます.
    let fruit = ['apple','grape','banana']
    console.log(!1) // false
    console.log(!0) // true
    !fruit['banana']--
    console.log(fruit) // ['apple','grape','banana', banana: NaN]
    
    の最後の部分
    レビューを読んだり理解したりするのに時間がかかったので、コメントが長くなったような気がしますが、今は理解したような気がして、後で自分の頭を掻く自分のために詳しく書き始めました.