Admob はモバイル広告の大手の会社で、去年の11月に7億5000万ドルで Google に買収されました。私もちょうど就職活動まっただ中だったので、Admob に履歴書を提出した直後にこのニュースを見て、驚いた記憶があります。MSE の友人から聞いた話では、Google に買収されたあたりから hiring が selective になった可能性があるそうです。もちろん、真偽は定かではありませんが。この5月から Microsoft の Developer になるというインド人の方と話をしたところ、彼の友人のインド人二人が Admob のオンサイトインタビューから自信満々で帰ってきたらしいのですが、結果二人とも reject されてしまったそうです。私の周りでは Admob とインタビューしていた人は一人、オファーを受けた人は一人もいませんでした(インタビューをしていた彼のその後の結果は分かりません)。かくいう私も電話インタビューの 2nd round で reject されてしまいました。
それでは、ここからインタビューの詳細に移ります。
Technical phone interview の一週間前にリクルータの人から電話があり、簡単な会話をしました。専攻は何か、いつ卒業するか、就労ビザは必要か、などなど。会話の最後に、どんなスキルが特に求められるか聞いたところ、「開発言語、ドメインは特にこだわらないから、CS の基礎が備わっていればいいよ」との答えをいただきました。ふむ、Google にも買収されたし、そこと似たような問題が飛んでくるのかなと思い、Google とインタビューをするような気持ちで挑みました。
[1st round interview]
最初のインタビューで出された問題は2つ。私はどちらの問題も CareerCup でおさえていたため、ここは乗り切ることができました。具体的には、
- Singly linked list に cycle があるかどうか、どのように判別しますか。また、cycle があった場合、そのcycle の開始点をどうやって見つけますか
- 100階建てのビルがあります。あなたの手元には同一のたまごが二個あります。たまごは、ある特定の階より上の階から落とすと割れていまいますが、その特定の階およびそれより下の階から落としても割れることはありません。その手元にある二個のたまごを使って、その特定の階を割り出してください。二個とも割れるとゲームオーバーですので、そうなる前に割り出してください。ただし、worst case でたまごを落とす回数が最少になるようなアプローチを考えてください
最初の問題を解くのに、Floyd's Cycle Detection と呼ばれるアルゴリズムがあります。
Programming Interviews Exposed の第4章にもありますし、WEB で検索してもすぐに見つかると思います。アイデアとしては、二つのポインタを用意し、list の頭から、ひとつめのポインタを1ノードホップで、もうひとつのポインタを2ノードホップで進めていきます。もしも cycle があれば、それらは cycle のどこかで出会い、cycle がなければ、2ノードホップで進んでいるポインタの方が先に list の末尾に到着するという具合です。cycle の開始点を割り出すには次のようにします。二つのポインタが出会ったら、二つのうちどちらでもいいので、片方のポインタを list の先頭に引き戻してあげます。そうしたら今度は、お互い1ノードホップずつで進めてあげて、次にそれらが出会う地点が cycle の開始点となります。modulo 演算を使うとなぜそうなるのかが分かります。Amazon がこの問題を出したときはその数学的な説明まで聞いていました。
二つ目の問題は正解だけ書きますね。一つ目のたまごを14階、27階、39階、50階、60階・・・と落としていき、それがいずれかの階で割れたら一つ前のステップの階に戻り(50階で割れたら、39階へ戻る)、そこからは一階ずつ増やして二つ目のたまごを落としていきます。これは有名な Brain Teaser の問題ですので、WEB で検索すると「なんでそうなるの?」が見つかると思います(たとえば
こちら)。
ちなみに、どちらの問題も Google や Facebook の時のようにオンラインコーディングをすることはなく、すべて口頭で答えを伝えました。数日後に interviewer から "good job!" のお言葉をいただき、2nd round interview に進むことになりました。
[2nd round interview]
このインタビューでは、自分のバックグラウンドを説明するところから始まり、技術的な質問がそれに続きました。
- オブジェクト指向プログラミングの概念を説明してください
- B-Tree のデータ構造について説明してください。要素を検索するときの実行速度はビッグ・オーで何になりますか?
- Model-View-Controller アーキテクチャについて説明してください
- 4GB のメインメモリで 4 byte の整数 1,000,000,000 個をソートしてください
私が時間内に正しい答えを出せなかったのが最後の問題でした。Mergesort の variant を使って部分的にソートしていくというところまで答えたのですが、そのステップを最後まで正確に説明できませんでした。この合計 4TB にもなる 1,000,000,000 個の整数は 4GB のメインメモリに一度に収まりきらないので、分割してソートしていく必要があります。これには External Sorting というソーティングを使いますが、申し訳ないことに具体的な数値に関しては今計算しているところです(メインメモリに用意する入力バッファ、出力バッファの適切なサイズ、K way merge をする際の multiple pass の数など)。
Database Management Systems の第13章と以下のビデオで勉強中です。
0 件のコメント:
コメントを投稿