Skip to main content

コーディングインタビューソリューションを改善する3つの方法-The Muse

Talkable : Brad Kam インタビュー|Digital Research (六月 2025)

Talkable : Brad Kam インタビュー|Digital Research (六月 2025)
Anonim

あなたはそこにいます。 安心。 疲れた。 最終的に、インタビュアーが尋ねるコーディングの難しい質問を解決するアプローチを思い付きました。 たぶん、あなたはホワイトボードに一行一行書きました。 そして、あなたは楽しい時間を過ごしました! 会議はわずか20分です。 あなたのインタビュアーは感動しなければなりません。

右?

「これは機能しますが、より効率的に行う方法についてのアイデアはありますか?」

あなたの心は沈みます。 あなたは、トリッキーなアルゴリズム設計部分で完了したと思っていました! あなたは問題を解決するためのより多くの方法を考えようとしますが、あなたが考えることができるのはあなたがすでに思いついた一つのアプローチだけです。

これはほとんどすべての人に起こります。 そして、それは彼らが愚かだからではありません。 これは、ほとんどの人がアルゴリズムの効率を改善する方法を持っていないためです。

しかし、真実はたくさんあります。 困ったときは、これらの3つの一般的なアプローチを適用してみてください。

1.ハッシュマップを使用する

そのとおり。 ハッシュマップ/連想配列/辞書(使用しているプログラミング言語に応じて多くの名前で使用されます)には、アルゴリズムの実行時間を短縮する魔法の能力があります。

たとえば、質問が数字の配列で最も繰り返される数字を見つけることだったとします。

最初の考えは、いくつかのループにジャンプすることです。 各数値について、その数を把握し、それが最大のものかどうかを確認します。 各番号のカウントを取得するにはどうすればよいですか? 配列をループし、発生回数をカウントします! したがって、2つのネストされたループについて話しています。 擬似コードで:

def get_mode(nums):max_count = 0 mode = numsのpotential_modeに対してnull:count = 0 our_arrayの数に対して:count> = max_countの場合count + = 1:mode = potential_mode max_count = count return mode

現時点では、配列内の各アイテムに対して配列全体を1回ループしていますが、さらに改善することができます。 大きなO表記では、合計でO(n 2 )時間です。

カウントをハッシュマップに格納する(数値をカウントにマッピングする)場合、配列をたった1回歩くだけで問題を解決できます(O(n)時間!):

def get_mode(nums):max_count = 0 mode = null counts = new HashMap、numsのpotential_modeの各値を0から開始:counts> max_countの場合、counts + = 1:mode = potential_mode max_count = counts return mode

はるかに高速!

2.ビット操作を使用する

これは本当にパックからあなたを際立たせるでしょう。 これはすべての問題に当てはまるわけではありませんが、これをバックポケットに入れて適切なタイミングで破壊すると、ロックスターのように見えます。

次に例を示します。1つの数字が1回だけ出現する場合を除き、すべての数字が2回現れる数字の配列があるとします。 孤独で繰り返しのない数を見つける関数を書いています。

あなたの最初の本能は、ハッシュマップを使用することかもしれません。 それは持っている良い本能です! そして、これはこれで動作します。 非常によく似た「カウント」マップを作成し、それを使用して、カウント1で終わる番号を確認できます。

しかし、さらに良い方法があります。 ビット操作に精通している場合は、XORに精通している可能性があります。 XORの特別な点の1つは、数値をそれ自体とXORすると、ビットが0に「キャンセル」されることです。この問題では、配列内のすべての数値をXORすると、1つの数値が残ります。キャンセルしない:

def find_unrepeated(nums):numsのnumについては、繰り返しなし= 0:繰り返しなし=繰り返しなしXOR num return unrepeated

3.ボトムアップに行く

番号nを指定して、「n番目」のフィボナッチ数を出力する関数を作成します。 これは古典的なもので、再帰に非常に適しています。

def fib(n):nが0または1の場合:1を返すfib(n-1)+ fib(n-2)を返す

しかし、単純な再帰的な答えだけではありません! この関数が何をするかを注意深く考えてください。 nが5であると仮定します。答えを得るために、fib(4)とfib(3)を再帰的に呼び出します。 さて、fib(4)の呼び出しは何をしますか? fib(3)およびfib(2)を呼び出します。 しかし、fib(3)の呼び出しが既にあると言ったばかりです! このかわいい再帰関数は、多くの繰り返し作業を行います。 合計時間コストはO(2 n )であることがわかりました。 それは悪いことです。O(n 2 )よりも悪い方法です。

nから再帰的に1に下がる代わりに、「ボトムアップ」で1からnに進みましょう。 これにより、再帰をスキップできます。

def fib(n):previous = 0 previous_previous = 1〜nの範囲のiに対して1:current = previous + previous_previous previous_previous = previous previous =現在の戻り電流

コードは長くなりますが、はるかに効率的です! O(n)時間まで。 再帰的アルゴリズムを展開する追加のボーナスとして、スペースを節約します。 これらの再帰呼び出しはすべて呼び出しスタックに蓄積されます。呼び出しスタックはメモリ内にあり、スペースコストにカウントされます。 再帰関数にはO(n)スペースコストがありましたが、この反復関数にはO(1)スペースが必要です。

次回、インタビュアーからソリューションの効率を改善するように求められたら、これらの戦略を調べて、それらが役立つかどうかを確認してください。 十分な練習を積めば、おそらく最適化されたソリューションに直接ジャンプし、より素朴なソリューションをスキップすることに気付くでしょう。 そしてそれは素晴らしいことです。 それは単にあなたがより良いインタビュアーになっているということではなく、あなたがより良いエンジニアになっているということです。