プログラマ-失敗率


説明する

function solution(N, stages) {
    var answer = [];
    let arr = [];
    for(let i = 0 ; i < N+2; i++){
      arr[i] = 0;
    }
  
    for(let i = 0 ; i < stages.length;i++){
      let val = stages[i];
      if(arr[val] == false){
        arr[val] = 1
      }else{
        arr[val] += 1
      }
    }
  // let len = arr.reduce((f, b) => f+b);
  let len = stages.length;
  answer[0] = -1
  for(let i = 1 ; i < arr.length-1; i++){
    if(len == 0){
      answer[i] = 0;
      continue;
    }
    answer[i] = arr[i]/len;
    len -= arr[i]
  }
  let notsortedArr = [...answer].slice(1);
  let sortedArr = answer.sort((a, b) => b-a).slice(0, arr.length-2);
  let newArr = [];
  for(let i = 0 ; i < sortedArr.length; i++){
    for(let j = 0; j < notsortedArr.length;j++){
      if(sortedArr[i] == notsortedArr[j] && !newArr.includes(j+1)){
        newArr[i] = j+1;
        break;
      }
    }
  }
    return newArr;
}

説明:


まずarr配列をゼロに初期化し,長さはN+2とした.
舞台を回る.
各階に何人いるかを求める.arr
現存するすべての人数を求めます.
各層の存在を見て、失敗率を求める.
求めた失敗率をソートされた配列とソートされていない配列にコピーします.
2つの配列を順次クエリーし、値に対応するインデックスを格納し、すでに含まれているインデックスの場合は次のインデックスを検索します.

残念なことに。


エラー・ケースの検索


1回目の解答では通らず、質問で1、6、7、9、13、23、24、25に関するエラーケースを見つけました.
自分で探しに行かなきゃ...ううう
テストケースも整理したほうがいいと思います.どんな面で見逃しましたか.
まずは今のTAKEは0/0が出るとは思わなかった.
どうやってこの考えを引き出すのか

jsの多様な方法は未熟である


他の人の解答を見て、似たようなアクセスをしましたが、コードはずっと簡潔です.
さっぱりしていてこそきれいだ
できるだけ早く相応の方法で修正して、努力して熟知しましょう!!

賢い人との比較



よく見ると、私のペーストとパトソンのペーストは100 ms以内に安定して掛けられています.
1位のプールはたまに3000~6000 ms以上走ります.
パフォーマンスチェックを行うと、この状態を維持するのは難しいです.
しかし、なぜこのようなパフォーマンスの問題が発生したのか分かりません.
1位解答
function solution(N, stages) {
    let ans = []

    for (let i = 1; i <= N; ++i) {
        let usersReachedCurrentStage   = stages.reduce((acc, curStage) => acc + ((curStage >= i) ? 1 : 0), 0)
        let usersStagnatedCurrentStage = stages.reduce((acc, curStage) => acc + ((curStage == i) ? 1 : 0), 0)
        if (usersReachedCurrentStage === 0) {
            ans.push({ 'stage': i, 'failRate': 0 })
            continue
        }

        ans.push({ 'stage': i, 'failRate': (usersStagnatedCurrentStage / usersReachedCurrentStage) })
    }

    return ans.sort((a, b) => {
        if (a.failRate > b.failRate) return -1
        if (a.failRate < b.failRate) return 1
        return a.stage - b.stage
    }).map(entry => entry.stage)
}

パトソン様のペーストを見て、ついていきます

function solution(N, stages) {
  let arr = [];

  for (let i = 0; i < N + 1; i++) {
    arr.push([0, 0, i + 1])
  }
  /*
  [
    [ 0, 0, 1 ],
    [ 0, 0, 2 ],
    [ 0, 0, 3 ],
    [ 0, 0, 4 ],
    [ 0, 0, 5 ],
    [ 0, 0, 6 ]
  ]
  */
  stages.forEach(el => arr[el - 1][0]++)
  /*
  [
    [ 1, 0, 1 ],
    [ 3, 0, 2 ],
    [ 2, 0, 3 ],
    [ 1, 0, 4 ],
    [ 0, 0, 5 ],
    [ 1, 0, 6 ]
  ]
  */
  let len = stages.length;
  for (let i = 0; i < arr.length; i++) {
    arr[i][1] = arr[i][0] / len;
    len -= arr[i][0]
  }
  /*
  [
    [ 1, 0.125, 1 ],
    [ 3, 0.42857142857142855, 2 ],
    [ 2, 0.5, 3 ],
    [ 1, 0.5, 4 ],
    [ 0, 0, 5 ],
    [ 1, 1, 6 ]
  ]
  */

  console.log(arr.slice(0, arr.length - 1).sort((a, b) => b[1] - a[1]).map(el => el[2]))
  // [ 3, 4, 2, 1, 5 ]
  
  // NaN이 나오는 예외가 있지만, sort함수에서 자동으로 0과 같이 젤 하단에 놓이게하기 때문에 별도의 처리를 하지 않아도 된다.
}

予想文のreduce関数?


正直、オブジェクトを入れて、オブジェクトの特定のプロパティを使用して比較演算を行うと、あまり時間がかかりません.
reduce関数を分解してみます.
次のブログで..。