CodeKata 3 - W2D2



質問する


数値配列numsをパラメータとして渡します.
数字のうち半数を超える(多数、半を超える)数字を返してください.
たとえば、
nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

家庭

numsアレイの長さは2より大きくなければならない

最初の解

function moreThanHalf(nums) {
  let list = [];

  const set = [...new Set(nums)]

  for(let a = 0; a < set.length; a ++){
     list.push(nums.reduce((cnt, element) => cnt + (set[a] === element), 0));
  }

  const max = list.reduce( function (first, second) { return first > second ? first:second; });

  let maxNum = set[list.indexOf(max)];

  return maxNum
}
set関数と拡散演算子を用いて,与えられた配列を新しい重複排除配列集合に変えた.
(最近はspread演算子にハマっていますが、何をしてもspread演算子に展開して、いろいろ試してみましょう.🥲 )
要するに、新しい配列setでfor文を回し、重複データ削除の新しい配列の要素をreduceメソッドを使用して既存のnums配列から抽出した要素と比較し、同じ値を持つと初期値0のcntが1ずつ増加し、そのcnt値pushがlistという空の配列に格納されます.
次にreduce法を用いてlist配列の値を再度比較し,最大値を求めmaxという変数に割り当てる.
最後にlist配列で最大値のindexを求め、そのindex値をset配列に入れ、index値としてmaxnum変数に割り当てる.
=>spread演算子、reduceメソッドなど、今まで使ったことのないメソッドを使いたいので、わざとこれらのメソッドを使って解答しました.慣れていないので、コードを書くとき、思いがけないエラーや欲しい値が出ることがありますが、このような過程を経て、これらの方法は少し慣れているような気がします.
解が終わってコードを見たのですが、慣れていない方法のせいかもしれませんが、感覚が乱れてコードがあまり目に合わないので、もっと馴染みのある方法で2回目の解をしました.

第二の解釈

function moreThanHalf(nums) {
  let manyNum = [];

  const newNums = [...new Set(nums)];

  for(let a = 0; a < newNums.length; a++){
  manyNum = [...manyNum,nums.filter(i => i === newNums[a]).length]
  }

  let maxNum = manyNum.indexOf(Math.max(...manyNum));

  return newNums[maxNum];
}
最初の解と同様に,与えられた配列をset関数と拡散演算子を用いて重複を除去する新しい配列newnumsに変えた.nums配列でfilterメソッドを使用し、for文を使用してnewnums配列の要素と比較します.lengthを使用して、各要素の重複数をmanynum配列に挿入します.
indexOfメソッドを使用して、ManyNum配列の最大値のindex値を決定し、maxNumという変数に割り当て、この値を使用して重複する配列newNumsを除去することに対応するindex値の要素を返します.
=>reduceと比較して、コードを少し熟知した方法で表示すると、取得する値が何であるかをより簡単に理解できます.しかし、不要な変数が多く使われているせいか、いつでもどこでもアイデアを思いついてコードが追加されているため、乱雑な感じは解消できません...😭

3番目の解

function moreThanHalf(nums) {
  let manyNum = {};
  nums.forEach((x) => {
    manyNum[x] = (manyNum[x] || 0) + 1;
  })

	const value=Object.values(manyNum).sort((a,b) => {return b - a})[0];
	
	const max = Object.keys(manyNum).filter((e)=>manyNum[e]==value?true:false)[0]
  
	return Number(max)
}
まずManyNumという名前の空のオブジェクトを作成し、forEachで配列numsの要素をキー値として、nums配列の各要素の重複数に要素をvalue値として入れます.
オブジェクトManyNumの値に基づいてsortメソッドを使用して降順ソートし、filterを使用して値を持つManyNumオブジェクトのキー値を取得します.[0]を使用する理由は、[0]を使用しない場合は配列値であるため、[0]を使用して配列内の要素のみを抽出します.
=>2番目の解答までは自分で解答する方法で、最後の解答はCode Cartaを行ったときに一緒に解答するという、全く思いつかなかった方法です.reactで素子を使用する場合はmapに少し慣れているかもしれませんが、foreachにも親しんでください.オブジェクトを問題解決に使用すると、より効果的で見やすいコードになるようです.アルゴリズムの解でいくつかのオブジェクトを多く使用しましょう.
1から2を数える