LeetCode 3日目

3日目の復習やっていきます。

49. Group Anagrams

タイトルのまんまアナグラムになっている要素をグルーピングする問題

ひとまず自分のコード

function groupAnagrams(strs: string[]): string[][] {
    let answer: string[][] = new Array();
    let mapAnagram = new Map<string, number>();
    let count: number = 0;

    for (let i = 0; i < strs.length; i++) {
        const str: string = strs[i];
        const sorted: string = sortStr(str);

        let key = count;
        if (mapAnagram.has(sorted)) {
            key = mapAnagram.get(sorted);
            answer[key].push(str);
            continue;
        }

        answer[key] = new Array();
        answer[key].push(str);


        mapAnagram.set(sorted, key);
        count++;
    }

    return answer;
};

function sortStr(str: string): string {
    return [...str].sort().toString();
}

実行速度的には問題なし。ただ、処理が複雑になってしまった。

分かり易いコード

function groupAnagrams(strs: string[]): string[][] {
    const hash: Map<string, string[]> = new Map();
    
    for (const string of strs) {
        const sorted = string.split("").sort().join();
        if (hash.has(sorted)) {
            hash.get(sorted)!.push(string);
        } else {
            hash.set(sorted, [string]);
        }
    }

    return [...hash.values()];
}

無駄な宣言がなく、純粋に処理を読みやすい。 あと、Mapの値に答えで利用できる配列を格納しているので直感的にコードを理解できる。

フムフム直感的に理解できるコードか~

プログラミングの原則覚えないと。

実務で開発できてない分、家でプログラミングするのが楽しい!