[TIL]Codekata-6

2862 ワード

質問するnumsはデジタル配列です.
最もよく見られる数字はk個です
nums = [1,1,1,2,2,3],
k = 2

return [1,2]

nums = [1]
k = 1

return [1]
に答える
nums = [1,1,1,2,2,3],
k = 2

function topK(nums, k) {
1)  let obj = {}
    nums.forEach( num => {
    obj[num] = !obj[num] ? 1 : ++obj[num]
    return obj;
  })
  
2) let sorted = Object.keys(obj).sort((pre, cur) => obj[cur] - obj[pre])
3) let result = sorted.slice(0, k).map(n => Number(n));
   return result;
}
説明:
1)nums配列内の各インデックスジッタ周波数値をカウントし、この値を収容するために空のオブジェクトobjを作成する.(前回のcodekataと同じ)
2)出現頻度に応じてkを切り捨て,降順(大数->小数)で表し,新しい変数ソートに格納する必要がある.
  • このとき、objオブジェクトにアクセスして値を取得するために、Object.keys(obj)にアクセスして、オブジェクトobjのキー値配列を作成する.
  • このとき,キーの値にsortという配列方法を用いて,周波数の高いものから(降順)リストしたい.Object.keys(obj).sort((a,b)=>obj[b]-obj[a])
  • !sortの使用方法を簡単に理解すれば、sortは関数をパラメータとし、関数の値に基づいて配列をソートします.ソート順の性質を持つsort関数の実行結果は,負の数が現れると自動的に逆のソートが行われる.
  • に変更されたobj要素を後ろから減算すると、降順でソートできます.obj[b]-obj[a]
  • 3)sortにより,前から頻度の高いキー値をソートすることができ,頻度の高いキー値を先頭からk番目にカットできるので,ソート後の配列の値を0番目のインデックスからk番目のインデックスにカットすることができる.let result = sorted.slice(0, k)
  • このときに切り取られた値の結果は、文字列タイプ値を含む配列である.
  • したがって,配列内の値を新しい配列に数値的に入れるためにmap法を用いて数値に変換し,結果値に入れる.let result = sorted.slice(0, k).map(n => Number(n)); 新しく学んだ事実
  • 今日私はナビゲーションマンで、エサは運転手の役を演じました.常に簡潔にコードを書く芸瑟のスタイルのため、コードは人に見られやすく、どのような順序で行うべきかを知っています.
  • 今日新しく学んだ方法はsortです.sortには、パラメータとして関数を受け入れ、関数が実行する値をソートする属性があります.
  • 最初の検査頻度の部分は前回解答した問題と似た構造を持っているので、比較的分かりやすい.
  • でオブジェクト鍵へのアクセス方法も再練習できてよかった!