アルゴリズム-宝くじの最高レベルと最低レベル

1516 ワード

問題の説明


宝くじを購入したミンウは、当選番号の発表日を楽しみにしていた.しかし、敏宇の弟は宝くじに落書きをして、番号の一部が分からなくなった.当選番号が発表された後、敏宇は自分が購入した宝くじの当選の最高順位と最低順位を知りたいと思っています.
読めない番号を0とし、できるだけ最高位と最低位を求めることにした.
I/O例
lottos = [44, 1, 0, 0, 31, 25]
win_nums =[31, 10, 45, 1, 6, 19]
result =[3, 5]
ランキング当選内容
6個の番号がすべて一致
25個の番号が一致
34個の番号が一致
3つの番号が一致
5と2個の番号が一致
6(落尖)その他

私が思いついた方法


0の個数を求めます
一致する数量を求めます
上位順位=7-一致個数-0個
低ランキング=7-マッチ数
コードを書き終わって、チェックして、その中の1つのテスト例がエラーを続けます.
確認の結果、異常処理が行われていないことが判明した
一つもマッチしないと7に登録されるから!!
下位順位では例外処理が施されたが、上位順位は無視された.
function solution(lottos, win_nums) {
  var answer = [];
  let match = 0;
  let zero = 0;
  for (let x of lottos) {
    if (x === 0) zero++;
    else if (win_nums.includes(x)) match++;
  }

  answer.push(7 - match - zero === 7 ? 6 : 7 - match - zero);
  answer.push(7 - match === 7 ? 6 : 7 - match);

  return answer;
}

より良い方法を追加


定義
  • 等数array,
  • rank=[6,6,5,4,3,2,1]:6が2の場合、0個、1対の両方が6等であるため、
  • の最小個数と最大個数をインデックスとして利用する方法は
  • である.
    function solution(lottos, win_nums) {
      const answer = [];
      const rank = [6, 6, 5, 4, 3, 2, 1];
      let match = 0;
      let zeroCount = 0;
      for (let x of lottos) {
        if (win_nums.indexOf(x) > -1) match++;
        else if (x === 0) zeroCount++;
      }
      const min = match;
      const max = min + zeroCount;
      answer.push(rank[max]);
      answer.push(rank[min]);
    
      return answer;
    }