コーディング面接対策で有名なサイト「LeetCode」で問題を解いてみた

[Supership](https://supership.jp/)の名畑です。待ちに待ち続けた[うる星やつらの「扉を開けて　前編」](https://www.youtube.com/watch?v=yKhj-JPn9Ek)、本当に良かったです。[OVA版](https://filmarks.com/movies/45059)からもう35年以上経っているんですね。当時繰り返し見たなという懐かしい記憶。後編も楽しみすぎる。そして、きっと、原作34巻、つまりは[完結編](https://filmarks.com/movies/26956)の令和版も今後ありますよね？

## はじめに

会社によってはプログラミング職での採用試験の際にコーディングテストを応募者に課すところがあります。
要は経歴や口頭試問だけでは能力を測らず、実際にコードを書いてもらうというものです。

ホワイトボードで書いてもらうような形式もあれば、試験問題を提供するWebサービスに挑戦してもらう場合もあるでしょう。

そんなコーディング面接対策で有名なサイトとして[LeetCode](https://leetcode.com/)があります。
そして**LeetCode**はコーディング面接対策だけではなく、定期的にコンテストも開催される競プロサイトでもあります。

今回はこの**LeetCode**でアカウントを作って実際に問題を解いてみたので、記事に残します。

## 言語

Englishと簡体中文の二つです。

日本語はありませんのでご注意ください。

## コース

有料の[Premium](https://leetcode.com/subscribe/)も用意されています。

有料プラン限定の問題や、特定企業の面接対策などのPremium Contentへのアクセス、問題を解いた際のジャッジ速度の高速化など、有料会員ならではのサービスもあるそうです。

約8割の問題は無料のままでも解けます。

## アカウント登録

問題においてコードを提出するためには[アカウント登録](https://leetcode.com/accounts/signup/)が必要です。

**LeetCode**でアカウントを作ることもできますし、**Google**、**Github**、**Facebook**、**Linkedin**のアカウントを用いてのログインも可能です。

## コーディング問題以外にどんなコンテンツがある？

[LeetCode Explore](https://leetcode.com/explore/)でざっくりおすすめコンテンツ的なものを見ることができます。

ここでは全部は触れませんが、例えば[Interview](https://leetcode.com/explore/interview/)では面接対策コンテンツが用意されています。

## コーディング問題

[Problems](https://leetcode.com/problemset/all/)にございます。

対応しているプログラミング言語は[What are the environments for the programming languages?](https://support.leetcode.com/hc/en-us/articles/360011833974-What-are-the-environments-for-the-programming-languages-)にまとまっています。**C++**、**Java**、**Python3**、**Ruby**、**Rust**などなど。

難易度は**Easy**、**Midium**、**Hard**の3つがあるようです。

画面は下記です。左側に問題が、右側にエディタがあります。

![leetcode_image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/1c1ce3c7-01bc-16eb-7845-59c0fd49a526.png)

シンタックスハイライトが適用されますし、書いたコードがテストケースを通るかどうかもこのエディタ上で完結します。

## Two Sumを解いてみた

今回は試しに[1. Two Sum](https://leetcode.com/problems/two-sum/)を**Python3**で解いてみました。
難易度はEasyです。
ちなみに、Easyとはいえ、[AtCoder](https://atcoder.jp/)の**Beginner Contest**のB問題とC問題の間ぐらいの難易度には感じました。

整数配列**nums**と整数**target**が与えられます。
**nums**のうちの「**足すとtargetになる2つの値**」を見つけ出すという問題です。

雑に総当たりで書いてみたコードが下記です。

```Python
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        sorted_nums = sorted(nums)
        for ix in range(len(nums) - 1):
            for i in range(ix + 1, len(nums)):
                if sorted_nums[ix] + sorted_nums[i] == target:
                    ans_list = [j for j, val in enumerate(nums) if val == sorted_nums[ix]]
                    if len(ans_list) > 1:
                        return ans_list
                    else:
                        ans1 = ans_list[0]
                        ans2 = nums.index(sorted_nums[i])
                        return[ans1, ans2]
        return []
```

**Sbumit**を押して提出して**Accepted**されると結果が下記のように表示されます。**実行時間**と**メモリー使用量**において全体順位のどのあたりにいるのかが明示されるのがいいですね。

![leetcode_image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/bd167a75-ba85-2179-28e6-dacd45d7853e.png)

コードを少しいじって総当たり途中でのbreakを追加してみました。

```Python
class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        sorted_nums = sorted(nums, reverse=True)
        for ix in range(0, len(nums) - 1):
            for i in range(ix + 1, len(nums)):
                if sorted_nums[ix] + sorted_nums[i] < target:
                    break
                if sorted_nums[ix] + sorted_nums[i] == target:
                    ans1 = [j for j, val in enumerate(nums) if val == sorted_nums[ix]]
                    if len(ans1) > 1:
                        return ans1
                    else:
                        ans1 = ans1[0]
                        ans2 = nums.index(sorted_nums[i])
                        return[ans1, ans2]
        return []
```

下記の通り、先ほどより実行時間が**1/10**程度になり、順位が上がっていることがわかります。解けたか解けないかだけではなく、改善の結果が実感できるのがいいですね。

![leetcode_image_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/81a31506-7ff8-775a-bfbc-a6445adb47d4.png)

## 最後に

3000以上の問題があり、使い勝手も非常に良く、普及していることが実感できるサービスでした。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。