はじめに
初めまして。アルゴリズムを全く学んだことがないソフトウェアエンジニアがLeetCodeを通じて強くなって行こう!という企画(?)です。
基本的に自分の振り返りように書いていくので意味がわからないところもあるかと思いますが悪しからず。。
初のLeetCode
最近転職を考えていて、対策として真っ先に上がるのがこのLeetCodeです。
このサイトでは企業のCoding面接の過去問や、アルゴリズムの基礎を学べる問題がたくさん掲載されています。
日本企業ではこのCoding面接は行っていないところも多いですが、SWE()として基本的なアルゴリズムくらい知っておかないとなと思い勉強し始めました。
有名どころだとAtCoderとかもありますが、AtCoderは数学的知識だったり競技性が強いということもあって、転職をするための準備としてはLeetCodeの方がいいのかなと思いこちらを選びました。
とはいえもう少し力がついてきたら赤コーダー目指して(???)挑戦していきたいとは思ってます。
取り組んでいく方針
LeetCodeではある程度問題をまとめて作られたコースのようなものがあります。
Coding面接用にこの150問はやっていけ!や、アルゴリズムの基礎学ぶならこの辺やっておけ!など、公式が用意してくれているので安心して取り組むことができます。
自分はとりあえずThe LeetCode Beginner's Guideというコースからやっていってます。
本当に基礎的な問題が集められており、leetCodeの使い方や解き方を学ぶためのコースみたいです。
これが終わったらTop Interview 150を進めて行こうと思ってます。
一部コースは有料で、今のことろ課金する予定はないのですが使い勝手良くなるっていうし給料上がるらワンチャン・・・?って感じです笑
383. Ransom Note
はい、いきなり問題についてですが笑
この問題苦戦しました。。もしよかったら皆さんも解きに行ってみてください。
この問題ですが英語で書かれていることと例に騙されて間違った解釈で進めてしまいました。
以下問題文
Given two strings ransomNote and magazine, return true if ransomNote can be constructed by using the letters from magazine and false otherwise.
Each letter in magazine can only be used once in ransomNote.
Example 1:
Input: ransomNote = "a", magazine = "b"
Output: false
Example 2:
Input: ransomNote = "aa", magazine = "ab"
Output: false
Example 3:
Input: ransomNote = "aa", magazine = "aab"
Output: true
Constraints:
1 <= ransomNote.length, magazine.length <= 105
ransomNote and magazine consist of lowercase English letters.
この問題は、まず2つの引数に0<x<10^5(上の問題文はコピペしておかしくなっていますがきちんと10の5乗です)までの長さの適当な英文字が渡されます。
そして1つ目の引数に渡った文字列が2つ目の引数の文字列のものから構成されているかという問いになっています。
そしてこの問題を自分は、1つ目の引数に入っている文字がそのままの順番通りで2つ目の引数に入っているという条件だと勘違いしていました。
まあこの条件だったとしてもそんなに難易度が変わるわけではないですが。
ただ何回submitしても通らず、おかしいなと思い問題文を見返してみたら一番下に書いてありました。。
Each letter in magazine can only be used once in ransomNote.
一つ目の引数に入っている各文字は2つ目の引数の中で1回ずつしか使えません。と。
ってことは順番関係なく、2重ループ回すだけか・・(安直)
ここでようやく気づき2~3分で修正して無事とおりましたとさ。。
ちなみにあまり見せたくないのすが以下が自分が書いたコードです。
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
macth_str = []
new_arr = []
count = 0
macth_count = 0
result_judge = len(ransomNote)
for char in ransomNote:
count += 1
if count == 1:
for char2 in magazine:
match_found = False
if char == char2:
new_arr = magazine.replace(char2, "", 1)
macth_count += 1
match_found = True
break
if match_found:
continue
else:
for char2 in new_arr:
match_found = False
if char == char2:
new_arr = new_arr.replace(char2, "", 1)
macth_count += 1
match_found = True
break
if match_found:
continue
if macth_count == result_judge:
return True
else:
return False
はい、正直かなり汚いと思います。(同じようなコードを書いている方がいらっしゃたらすみません。)
アルゴリズムもクソもなく、ただifとforでゴリ押しただけです。
内包表記や他の表現が使えるところがあるのかもですが、ちゃんと通ったことが嬉しくてまだセルフレビューや他の方の回答を見るなどはできてないです。(この記事書いたらします。。)
他の方の回答を見るのはもう鉄則だと思っているので、つよつよエンジニアの方のコードを穴が開くほどみてみようと思います。
まとめ
はい全然まとまってないですが今回はこの辺で終わりにしようと思います。
SWEとしてやっていけてはいますが、いまだにCSの基礎や情報科学の基礎がないのでその辺りも勉強して行こうと思います。
余談ですが、この時代にそんなの勉強する必要ある?と思った方もいるかもしれませんが、自分はその逆で考えています。
これからはAIがコードを書いてくれたりもはやシステムを作ってくれたりするかもですがその根幹を支えているのがこれらの技術です。
ぜーーんぶAIがやってくれるというのはそんなに近い将来の話ではないかと思っていて、少なくとも数年間は自分の手と頭で稼ぐ以上知っておくに越したことはないと思ってます。
もっと市場価値を上げて、ムキムキのつよつよエンジニアになれるよう頑張っていきます!
拙い文章、汚いレイアウトでしたがここまでみてくださった方がいたらありがとうございます。
気が向いたらまた書こうと思います。
ではまた。(この終わり方昔のブログみたい?笑)