Supershipの名畑です。待ちに待ち続けたうる星やつらの「扉を開けて 前編」、本当に良かったです。OVA版からもう35年以上経っているんですね。当時繰り返し見たなという懐かしい記憶。後編も楽しみすぎる。そして、きっと、原作34巻、つまりは完結編の令和版も今後ありますよね?
はじめに
会社によってはプログラミング職での採用試験の際にコーディングテストを応募者に課すところがあります。
要は経歴や口頭試問だけでは能力を測らず、実際にコードを書いてもらうというものです。
ホワイトボードで書いてもらうような形式もあれば、試験問題を提供するWebサービスに挑戦してもらう場合もあるでしょう。
そんなコーディング面接対策で有名なサイトとしてLeetCodeがあります。
そしてLeetCodeはコーディング面接対策だけではなく、定期的にコンテストも開催される競プロサイトでもあります。
今回はこのLeetCodeでアカウントを作って実際に問題を解いてみたので、記事に残します。
言語
Englishと簡体中文の二つです。
日本語はありませんのでご注意ください。
コース
有料のPremiumも用意されています。
有料プラン限定の問題や、特定企業の面接対策などのPremium Contentへのアクセス、問題を解いた際のジャッジ速度の高速化など、有料会員ならではのサービスもあるそうです。
約8割の問題は無料のままでも解けます。
アカウント登録
問題においてコードを提出するためにはアカウント登録が必要です。
LeetCodeでアカウントを作ることもできますし、Google、Github、Facebook、Linkedinのアカウントを用いてのログインも可能です。
コーディング問題以外にどんなコンテンツがある?
LeetCode Exploreでざっくりおすすめコンテンツ的なものを見ることができます。
ここでは全部は触れませんが、例えばInterviewでは面接対策コンテンツが用意されています。
コーディング問題
Problemsにございます。
対応しているプログラミング言語はWhat are the environments for the programming languages?にまとまっています。C++、Java、Python3、Ruby、Rustなどなど。
難易度はEasy、Midium、Hardの3つがあるようです。
画面は下記です。左側に問題が、右側にエディタがあります。
シンタックスハイライトが適用されますし、書いたコードがテストケースを通るかどうかもこのエディタ上で完結します。
Two Sumを解いてみた
今回は試しに1. Two SumをPython3で解いてみました。
難易度はEasyです。
ちなみに、Easyとはいえ、AtCoderのBeginner ContestのB問題とC問題の間ぐらいの難易度には感じました。
整数配列numsと整数targetが与えられます。
numsのうちの「足すとtargetになる2つの値」を見つけ出すという問題です。
雑に総当たりで書いてみたコードが下記です。
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されると結果が下記のように表示されます。実行時間とメモリー使用量において全体順位のどのあたりにいるのかが明示されるのがいいですね。
コードを少しいじって総当たり途中でのbreakを追加してみました。
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程度になり、順位が上がっていることがわかります。解けたか解けないかだけではなく、改善の結果が実感できるのがいいですね。
最後に
3000以上の問題があり、使い勝手も非常に良く、普及していることが実感できるサービスでした。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。