[JS]プログラマーコードテスト練習|貪欲法-スポーツウェア


質問リンク:プログラマー-コードテスト練習|貪欲法|スポーツウェア
1.問題の説明
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
2.制限
  • 全体の生徒数は2名以上30名以下であった.
  • 運動服を盗まれた生徒数は1名以上n名以下で重複番号はない.
  • 着以上のユニフォームの学生数は1名以上n名以下で、重複番号はありません.
  • 着以上の運動服を持っている学生だけが他の学生に運動服を貸すことができます.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.

  • 例1
    1番学生は運動服を2番学生に貸し、3番学生または5番学生は運動服を4番学生に貸し、5人は体育の授業を受けることができる.
    例2
    3番の学生は運動服を2番の学生か4番の学生に貸して、4人の学生は体育の授業を受けることができます.
    3.私の回答
    function solution(n, lost, reserve) {
      const arr = Array(n).fill(0);
      lost.map((l) => (arr[l - 1] -= 1));
      reserve.map((r) => (arr[r - 1] += 1));
    
      arr.map((v, i) => {
        if (v + arr[i + 1] === 0) {
          arr[i] = 0;
          arr[i + 1] = 0;
        }
      });
    
      return arr.filter((v) => v >= 0).length;
    }

  • まず、長さnで埋め込まれた0の配列を作成します.

  • 配列の中でジャージを失った友達のインデックスの中で-1は2セットのジャージを持ってきた友達のインデックスの中に置かれています1
    例えば、arr=[0,−1,1,1,0]

  • そんなARRを地図に変換して
    現在値と次の値の合計が0の場合は、現在値と次の値を0に割り当てます.

  • 最後に0以上の値をフィルタリングして、戻り長さが終わります!
  • 解けるのは簡単ですが、一日中考えていました.
    変だと思ったらそこから出てきて、時間が長すぎます