はじめに
昨日に引き続き、今度は残りの中級3つやろう。
Group Anagrams
Given an array of strings strs, group the anagrams together. You can return the answer in any order.
文字列の配列が与えられる。それらの中でアナグラムであるもの同士をグルーピングして配列として返せ。
なお順不同である。
# @param {String[]} strs
# @return {String[][]}
def group_anagrams(strs)
hash = {}
strs.each do |str|
key = str.chars.sort
hash[key] ||= []
hash[key] = hash[key] + [str]
end
hash.values
end
このsortしたやつをkeyにするやつね。
こういうのはまぁ慣れてきた。
valuesにすることでhashのvalueをそれぞれ配列で取り出して、最後それらを配列で閉じてくれるやつも
この前知った。
ただこういうのもあった。
# @param {String[]} strs
# @return {String[][]}
def group_anagrams(strs)
map1 = {}
strs.each do |str|
s = str.bytes.sort
map1[s] ||= []
map1[s] << str
end
map1.values
end
bytesにすると何がええんやろ。
Top K Frequent Elements
Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.
数字の配列と整数kが与えられる。最も出現する要素を上からkこ特定し、配列として返せ。
なお順不同。
# @param {Integer[]} nums
# @param {Integer} k
# @return {Integer[]}
def top_k_frequent(nums, k)
nums.tally.sort_by {|_, v| v}.last(k).map {|array| array[0]}
end
これは前やったtallyの印象が強すぎて覚えてた。
あとは要素をkeyにしてやるやり方だけど結局tallyを自前でやってるってだけ。
def top_k_frequent(nums, k)
# nums.tally.sort_by {|_, v| v}.last(k).map {|array| array[0]}
hash = Hash.new(0)
nums.each do |num|
hash[num] += 1
end
hash.sort_by {|_, v| v}.last(k).map {|e| e.first}
end
次の問題は課金しないとダメだったのでスルー。
終わりに
ちょうどいいからこれで終わりにしよう。
よーやった。以上。