LoginSignup
0
1

More than 3 years have passed since last update.

LeetCodeのすヽめ ~フィボナッチ数列を例に~

Last updated at Posted at 2019-07-06

ブログ記事からの転載)

唐突ですが、私のマイブームを紹介します。

LeetCodeという、コーディングの問題集的サイトです。
最近はここで毎日問題を解いているんですが、せっかくなら何かしらアウトプットした方がペースメーカーにもなると思い、ブログ記事にします。

LeetCodeでは、エンジニアの面接で行われるCoding Interviewで実際に出題された問題が掲載されているそうです。
実際にGoogle等のCoding Interviewを受けた人の話では、全く同じ問題は出ないが、LeetCodeをやっておけば解ける問題が出た、とのことでした。
難易度のレベルがEasy/Medium/Hardとあり、C/Java/Python/Rubyなど多くの言語に対応しています。
各問題にDiscussionページが設けられ、他のユーザーの解法を見て勉強できます。
一部問題には公式のSolutionページもあります(無料会員と有料会員で見られる範囲が異なります)。

ビジネスパーソンの方々、なんだエンジニアの話か、と思うなかれ。
特に小中高校時代に算数が得意だった方にとっては、なかなか面白いサイトだと思います。
これを機会にコーディングデビューしてみては?と思うくらい。

例えば以下の問題。

You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.

階段を上っていて、1段ずつないしは1段飛ばしでしか上れないとしたとき、n段目まで上る方法はいくつある?という問題です。
こんな問題、どこかで聞いたことありませんか?

n段目まで上るには、n-1段目から1段上るか、n-2段目から1段飛ばしで上るかのどちらかになります。
つまり、n段目までの上り方の数を$f(n)$とすると、$f(n)=f(n-1)+f(n-2)$になるわけです。
「フィボナッチ数列」という言葉を聞いたことはありませんか?「前の2つの数を加えると次の数になる」という数列で、まさにそれにあたるわけです。

これをコードで書くと、以下のようになります。

class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            i = 3; a = 1; b = 2
            while i < n:
                a, b = b, a+b
                i += 1
            return a+b

もっと簡単に書くと以下の通り。

class Solution:
    def climbStairs(self, n: int) -> int:
        a = b = 1
        for _ in range(n):
            a, b = b, a + b
        return a

エンジニア目線では、LeetCodeは処理時間とメモリ使用量について、計算量オーダー(あるアルゴリズムを使った演算の性能を表す指標)も示してくれるので助かります。
ただsubmitごとに値が大きく変わっていて(特に処理時間)、LeetCode側のサーバー側がどれだけ混んでるかに依っていそうなので、あくまで参考値ですが。

最後に、私がLeetCodeを知るきっかけになったTweetを紹介します。

とある理由でKaggleを注視しているんですが、なかなか敷居が高いですし、世の中の大半を占めるであろう、機械学習活用度 Low ~ Middle 層では、ここまでのスキルが必要か?と思っていました。
そう思っていたところでこのTweetを見て、我が意を得たり、と思ったわけです。

さて、このLeetCodeについてですが、今後は不定期ながらもこのBlogやQiita上で面白いと思った問題を取り上げていこうと思います。

~以下余談~

LeetCodeのもとになっているCoding Interviewですが、、日本では全くと言っていいほど行われていないそうですね。
今をときめく○ルカリのエンジニア面接に臨んだ米国大学卒の子(LeetCodeヘビーユーザー)が、「あなたの志望動機は〜」「強みは〜」など通り一遍の質問だけ聞かれて落とされ、納得いかない・・・と言ってました。
単純に評価できる人がいないということなんでしょうが、日本のITリテラシの低さの一端がまた見えてしまった気がします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1