プログラマーコードテスト「模擬試験」


function solution(answers) {
    let answer = [];
    let students = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]];
    let tmpArr = [];

    
    for (let i=0; i<students.length; i++) {
        let cnt=0;
        let n=0;
        
        for (let j=0; j<answers.length; j++) {
            if (students[i].length === n) n=0;
            if (answers[j] === students[i][n]) cnt++;
            n++;
        }
        
        if (tmpArr.length === 0) tmpArr.push([i+1, cnt]);
        else if (tmpArr[tmpArr.length-1][1] < cnt) {
            tmpArr=[];
            tmpArr.push([i+1, cnt]);
        } else if (tmpArr[tmpArr.length-1][1] === cnt) tmpArr.push([i+1, cnt]);
    }
    
    if (tmpArr.length === 1) answer.push(tmpArr[0][0]);
    else {
        for (let i=0; i<tmpArr.length; i++) {
            answer.push(tmpArr[i][0]);   
        }
    }
    
    answer.sort((a, b) => {return a - b} );
    
    return answer;
}

解法

  • はまず学生たちが質問を撮るパターンを並べて、それからどのように答え[i]と学生1の正解[i]を回して、それから学生2号、学生3号です.しかし、学生の解答の長さは違いますよね?
  • の2次元配列の長さは、インデックスによって異なることができる.だから学生の配列には学生たちの正解パターンが加わった.そして答え(質問数)は最大10000個で、学生の答えの並びの長さは限られています...答えと同じインデックスに追加することはできません.新しくnという変数が宣言され、for文の終了時に増加を維持し、nが正の戻り列の長さに等しい場合、0のif文に初期化されます.
  • tmparrでtmparr長が0の場合、無条件[i+1(生徒番号),cnt(正数)]push,tmparrの最後のインデックスの正数がcntより小さい場合は、tmpar配列を初期化し、push,tmparrの最後のインデックスの正数がcntに等しい場合は、押す.
  • tmparの長さが1であれば、tmpar[0][0]を答えに押し込み、1より大きい場合はドア回りに[5][0]を押す.
  • 、次に昇順をソートします.
  • ...でも本当にこんなに长く和弦を书くのが正しい.できますか.
  • 他人を解く

  • Math.maxも使いたいと思っていましたが、同じ値段なら1つだけ出して諦めました.でもMathmax.apply(null、変数(または関数))は一般的な方法です.
    *Math.max.applyは2番目のパラメータビットで配列を受け入れます.△最初の席は何でもいいです.
  • map、filter、foreach、objectと書く人がたくさんいます...私はやはりうまく書けないので、内蔵関数を使うのが恥ずかしくて、コードが確かに短くなったような気がします.
  • 「いいね」の数が最も多いのは
  • です
  • 学生の正解を「学生1」変数で1次元配列として宣言します.
  • answers.filter((a,i)=>a==学生1[i%学生1.length]).length;
    このような形で各値を「学生1 c」変数に含め、Math.maxを使用して得られた結果値をmax変数に含めます.
  • if文で「学生1 c」変数とmaxが同じであることを示すと、答えにプッシュするように宣言される.
    ...こんなに簡単に解けますよ!