LeetcodeのMySQL問題 Easyを5問解いた
概要
データベース問題を5問解きました。今、MySQLを構築する必要があるのだが、そもそもMySQLって何ができるのかよくわからなかったのと、データベース扱えないのはハムスターとしてどうだろうかと思ったので。
計算量を気にしてはいけないという知見が得られた。
leetcode 175. Combine Two Tables
https://leetcode.com/submissions/detail/109297935/
概要:人と住所のリストを全列挙せよ。しかし、人に対して必ずしも住所が割り当てられているとは限らないので、わからない場合は住所としてNULLを出力せよ。
解法:何がなんでも片方のキーを全部出力したい場合は、OUTER JOINTを使う。
leetcode 181. Employees Earning More Than Their Managers
https://leetcode.com/submissions/detail/109299369/
概要:人には、給料があり、上司がいたりいなかったりする。上司より給料が高い人を全列挙せよ。
解法:ポインタ使ってO(n)でできそう(これは罠で競技プログラミングではなくデータベースやぞ)。ポインタ?なにそれおいしいの??というデータベースさんなので、inner jointでO(n2)でテーブルの直積を作って、くっつけたレコードが上司関係だったら確認する。こういう非直感的なのはつらい。
leetcode 182. Duplicate Emails
https://leetcode.com/submissions/detail/109300798/
概要:人はメールアドレスを登録している。複数人に登録されているメールアドレスを列挙せよ。
解法:unordered setを使ってO(n)でできそう(これは罠で競技プログラミングではなく以下省略)。setとは??表しか使えませんが…???wwという感じなので、inner jointでO(n2)でテーブルの直積を作って、くっつけたレコードのidが違うのにメアドが同じメアドをひたすら集める。idは重複し得るので、select distinctで重複除外する。
leetcode 196. Delete Duplicate Emails
https://leetcode.com/submissions/detail/109302333/
概要:人はメールアドレスを登録している。重複メールアドレスがあったら、IDが大きい物を削除してユニークにせよ。
解法:下からなめていって、unordered setのcountが1以上だったら削除、を繰り返してO(n)でできそう(これは罠で以下省略)。相変わらず非効率が好きなので、inner jointでO(n2)でテーブルの直積を作って、くっつけたレコードのid大きいのにメアドが同じものをひたすら集めたテーブルを作る。この直積の中で、大きいidが集まっているテーブルの方を全削除する。
leetcode 595. Big Countries
https://leetcode.com/submissions/detail/109303889/
概要:300万km2の面積と2500万人以上の人口を持つ国を全列挙せよ。
解法:これは流石にselect whereするだけ