フィズバズ、文字列を逆にするなどの簡単な質問があると思います。それから、特定の質問があります。制約。最悪の部分は、技術的な知識のないリクルーターがこれらの質問のいくつかを尋ね、非常に具体的な答えを探していることです。...最適な答えを出さなければ、彼らはあなたを絶対バカだと思います。あなたの答えがうまくいくとしても、問題を解決し、最適ではないかもしれませんが、それは非効率的ではありません。
いくつかの例:
カードのデッキをどのようにシャッフルしますか?彼らはFisher-Yatesメソッドを探していますhttp://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle他の答えは「間違っています」.....これは、前にカードをシャッフルして、具体的に調べた場合を除いて、あなたが知っている可能性が高いものではありません。あなたは答えを出す過程でそれに出くわすかもしれませんが、私が見たことから、彼らはあなたがこの風邪を知っていると期待しているので、解決策を見つけるために与えられる多くの時間が与えられることは疑わしいです。別の非効率的な(ただし、より明白な)方法は、元の配列へのポインターと乱数である新しい配列を作成し、乱数で配列をソートすることです。次に、ソートされた配列を使用して、カードの新しい配列を作成します。いずれにせよ、私はそれを採用担当者に提示したことで0クレジットを得ました。
別の例は、すべて1からn-1までのn個の数字のリストで重複した数字をどのように検出するかについての質問です。明らかな答えは(時間の観点では比較的効率的です)、ハッシュテーブルを使用して各要素を挿入し、既に挿入されている要素が見つかった場合、重複を見つけます。最適な答えは、重複がない場合は数値が1〜nであるため、期待される合計はn(n + 1)/ nとして取得できることです。次に、配列を合計すると、実際の合計が得られますが、これは予想される合計よりも少なくなります。だから基本的にn-(予想合計-実際の合計)=重複番号...これはかなり特別なケースです....昔のインタビューの問題に関するオンライン投稿で、以前に同じトリックの関連するものについて何かを見たので、私は大丈夫だった....
もう1つは、追加のスペースを使用せずに文字列内のすべての単語を逆にします。私はそれについて考えなければならなかったし、リクルーターは私が思った5分でかなり焦りました(逆に文字列を分割して再結合するか、新しい配列に単語ごとに行くのは非常に簡単です)。最後の単語の境界線を見つけ、最初の単語の終わりを見つけ、リスト全体を常に1ずつ下にシフトしてから、適切な文字を挿入しました。次に、リストの最後に達するまで繰り返します。この方法は機能し、インタビュアーは同意しました(彼は少し専門的でした)が、非常に非効率的です。家に帰ったとき、私は最適な答えを探しました。それは単にリストを逆にしてから、個々の単語を逆にすることです。一部の人々はそれを思い付くかもしれません、
これらの問題のいくつかを見たら、それを簡単に解決できるようになりました。同じトリックのいくつかでいくつかの同様の質問があるからです。特に、n(n-1)/ 2の数式と数値リストにはいくつかのバリエーションがあることを知っています。しかし、これらの質問が何をテストするのかはまだわかりません。FizzBuzzは誰もができるはずのことです(ただし、それほど単純ではないバリエーションを見てきましたが、その場合、コードを入力/デバッグすることなく、インタビューの状況でそれが現実的かどうか疑問に思い始めます)。これらの質問のいくつかは、一度見れば明らかですが、もしあなたがそれらを見ていないなら、それらは明白ではありません。誰かが言及した後、バイナリ検索の最初の正しい実装が現れるまでに何年もかかりました...誰もがそれを読むことができるので、現在バイナリ検索はとても明白です。
それにもかかわらず、最悪の部分は、非技術的な人々があなたのソリューションが最適ではないが正しいと評価できないために質問をするときだと思います。彼らはあなたの解決策が提示されたものではないことを知っているので、それはすべて間違っている、あなたはその試みに対して信用を得られない。最適ではないソリューションでさえ、プログラミング構成の知識を示すことがよくあります。私がポーカーゲームをプログラミングしているのでなければ、誰かがカードのデッキをシャッフルできるかどうかは気にしません。たとえ私がそうであったとしても、彼らに効率的なアルゴリズムを示した後、私は中途半端な人なら誰でもそれに従うことができると確信しています。
テンプレートの質問は、テンプレートの質問をより多く見ている可能性が高いため、面接時間が長かった候補者に有利になるようです。FizzBuzzでさえ、最初にそれを見るとき、あなたはおかしくなりますが、何度も何度もそれを見ると、あなたはそれにもっと慣れます。最善の方法は、カスタムビジネスロジックを必要とするコーディングの課題を与えることです。たとえば、データセット(オブジェクト/レコードの配列)を作成してから、各オブジェクトに適用して回答を返すビジネスルールを作成します。たとえば、ある種の評価など、非常にカスタムルール)。彼らはおそらくレコードをループし、ロジックを何百万回も適用しますが、ルールは一意であるため、少なくとも作成したルールを理解し、正常に実装する必要があります。
予想される給与と、候補者のリストとそのお気に入りのビデオゲームのトップ3、そしておそらく初任給としましょう。ゼルダが好きな候補者は300のペナルティを受け取り、小さな人魚が好きな候補者は200のボーナスを受け取ります。ドンキーコングとスーパーマリオブラザーズは好きだが、マリオ博士は好きではない候補者には300ボーナスが与えられます。MetroidやKid Icarusが好きな候補者には200ボーナスなどが与えられます。ちょっと狂っているように見えますが、ビジネスルールを論理的なプログラム構成に変換し、ブールロジックの理解度をテストする能力を示します。全体的には、モジュラスとループを使用しないことを除いて、fizzbuzzとそれほど大きな違いはありません。もちろん、リストを提供してリストをループさせ、特定の出力条件を使用して結果を画面に出力することもできます。