Torihaji's Growth Diary

Little by little, no hurry.

LeetCode生活10日目

はじめに

昨日に引き続き、今度は残りの中級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

次の問題は課金しないとダメだったのでスルー。

終わりに

ちょうどいいからこれで終わりにしよう。

よーやった。以上。