お気に入りのホワイトボードインタビューの問題は何ですか?[閉まっている]


52

タイトルが示すように、お気に入りのホワイトボードのインタビューの問題は何ですか、そしてなぜそれがあなたにとって効果的であることが証明されましたか?

ジュニア、シニア、Java、C、Javascript、PHP、SQL、擬似コードなど


4
私が嫌った問題は、アインシュタインのパズルでした。stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html 30分ではできませんでした。しかし、私は腹を立てて、これを見つけました:games.flowix.com/en/index.htmlだから私は20分で平均6 x 6 x 6のより難しい問題をやるように訓練しました。今では30分で5 x 5 x 5を処理できると思います。雇用主が私に投げかけるどんな愚かなパズルでも-私はそれらを覚えていて、次回それらをエースします。たくさんの良いパズルがあります。
仕事

20
@ジョブ:どれも従業員が仕事でどのように働くかについて何も教えてくれません。もちろん、実際の仕事を終わらせるのではなく、この種のパズルを解くためにすべての仕事時間を費やさない限り。
ロバートハーベイ

1
@Robert Harveyは、パズルを解く以外の方法でお金を稼ぐビジネスをしているということですか?私にはわからなかった...;)しかし、そのパズルは楽しいです。補足として、私が以前働いていた会社は、スクリーニングの最初のステップとして実際の IQテストを使用していました。単に候補者を選別するのではなく、最良の候補者を分離するためのホワイトボードの良い質問を見つけたいと思います。
ニコール

4
@Renesis:開発者として、パズルを解くことで問題解決と分析のスキルがどのように識別されるかがわかりますが、開発者はそのソリューションをコードに変換する方法も知っている必要があります。パズルを解くと、その実行の半分しか表示されません。Rubixキューブを解くことと、Rubixキューブを解くためのアルゴリズムを書くことの違いです。
ロバートハーヴェイ

@Robert Harvey同意します。私は問題を考えるだけでなく、コーディングの問題を特に探しています。
ニコール

回答:


22

候補者に、日々の業務で実際に遭遇た問題の解決策設計するよう依頼します。そうすることで、私と候補者との間に対話を作成しようとします。私は彼がこれまでに問題について考えたことがなかったかのように彼が構築している設計について議論しようとします。

私が評価しようとしているのは、お互いを理解できるかどうか、そして混乱なく技術的な問題について話すことができるかどうかです。

具体例

(Javaデスクトップ開発者向け)

Webブラウザーのナビゲーション履歴(前のページ、次のページ、前の10ページのリスト)を処理するAPIを設計します。これは、アプリケーションの多くの部分で再利用できます(ここでは、アプリで具体例を示します)。次に、実装をスケッチします。

私はこれが好きです、それは十分にシンプルで、説明しやすく、ステップバイステップで解決でき(すべてを壊すことなく追加の動作を追加できる)、エッジケースとエラー処理について話すことができ、データについて話すこともできます構造。


40

候補者にインタビューし、ビジネスが存在しない候補者を除外すると、これが非常に明るくなることがわかりました。複雑さはFizz Buzzに似ていますが、データベーススキルに焦点を当てています。

Assuming the following basic  table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)

Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995  
Part 2: Documents that contain the keyword "Blue"  
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"

私は彼らに彼らが望むどんなSQLバリアントでもそれを書かせました、そして、マイナーな構文問題についてあまりうるさいことはありません。主に、リレーショナルDBの基本的な概念を理解していることを知りたいです。

ほとんどの候補者は、まったく問題なくパート3を通過できます。パート4の答えは、where句で演算子をORからANDに変更するだけであると考える人がどれだけいるかと驚くでしょう。


2
ああ、#4の問題があります。ドキュメントには行ごとに1つのキーワードしかないため、「Blue」タップ
-glasnt

8
おっと!インタビューで自分が(4)に陥るのを見ることができます。@ジョブ:インタビュアーとして、私は候補者に質問を説明するよう頼みます。(通常、最初の試行で質問に答える候補者以上のものを教えてくれます。)
peterchen

3
@Renesis、これが本当に深く掘り下げているかどうかはわかりません。これは、誰かが基本的なSQLクエリスキルを持っているかどうかを調べるのに非常に良いようです。私は実際、これらの基本的なスキルを身につけている開発者がほとんどいないことに本当にショックを受けています。
マークフリードマン

2
@ jk01、私はおそらくこれについて古い考え方を持っているかもしれませんが、IMOはバランスの取れた開発者であり、コードを介してアクセスするのではなく、少なくともクエリを試してドメインを理解するためのDB知識が必要です。これがないと、開発者にはかなり重大な盲点があります。また、システムのサポートとトラブルシューティングにも非常に役立ちます。抽象化は開発の簡素化と生産性の向上に役立ちますが、これは非常に頻繁に抽象化されるため、あまりにも多くの仮定が行われているのを見てきました。私は続けることができますが、これは他の場所で行われていると確信している他の完全な議論かもしれません;)
マークフリードマン

4
@ back2dos-答えられないからといって怒らないでください。これを簡単にするテクノロジーは他にもたくさんあるかもしれませんが、私たちは多くのSQLデータベースを使用しており、インタビューの質問に答える必要がない理由を言い訳するのではなく、使用するテクノロジーの使用方法を知っている人を募集しています。
JohnFx

20

「デリケートな詳細を明かすことなく、ホワイトボードに最後に取り組んだプロジェクトのデザインを描いてください。」


デザインをどのように定義しますか?クラス図をお探しですか?別のUML図?層の基本的なスケッチ?
justkt

1
私はそれらをバルーングラムと呼びます。;)サークルを描き、名前を付けて名前付きの矢印でつなぐだけです。私は彼の申請については気にしませんが、彼がそれを理解したという事実については気にします。
ウベルト

5
+1。以前に仕事をしていた人々にとって、これは間違いなくあなたができる最高のことの一つです。プロジェクトがどのように構成されたかを説明できれば、それはすでに価値があります。なぜそれがそのような特定の方法で構成されたのか、またはいくつかのことをどのように改善できるのかについてアイデアを持っている場合、これは本当に大きなプラスです。
back2dos

3
@justkt:重要なのは、インタビュー対象者が情報を入手することです。どうでもいい。私は実際にUMLを知っている人、UMLでそれを説明できない人、および複雑なシステムをいくつかの波線で説明できる人に会いました。
back2dos

2
繊細なディテールを明かすことなくプロジェクトのデザインを描くことになっている人はいますか?
ネマンジャトリフノヴィッチ

14

実装strcpystrcmpおよび友人。


4
候補者に実施をお願いしますatoi()
chrisaycock

2
あなたはいくつの人々が実装できないかに驚くでしょうstrdup()
ティムポスト

10
求人がCプログラマー向けである場合にのみ公平です。

私の現在の仕事のインタビューで、インタビュアーはstrrev()関数を実装するか文字列を逆にするように私に頼みました。私のホワイトボードソリューションは彼らに感銘を与え、現在仕事をしています。
グルシャン

@crisaycock atoi()は簡単です。itoa()は不正です
マイケルブラウン

14

いくつかの分野を含む私のお気に入りは、インターフェイス(C#で)が与えられたバイナリツリー内のノードの数を数えることです。

public interface IBinaryTree<T>
{
    IBinaryTree<T> Left
    {
        get;
    }

    IBinaryTree<T> Right
    {
        get;
    }

    T Data
    {
        get;
    }

    // Other properties and methods not germane to this problem.
}

面白くするために、ここに実装を示しますが、インタビュー先はこれを見る必要はありません。

public sealed class BinaryTree<T> : IBinaryTree<T>
{
    private readonly IBinaryTree<T> left;

    private readonly IBinaryTree<T> right;

    private readonly T data;

    public BinaryTree(
        IBinaryTree<T> left,
        IBinaryTree<T> right,
        T data)
    {
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public IBinaryTree<T> Left
    {
        get
        {
            return this.left;
        }
    }

    public IBinaryTree<T> Right
    {
        get
        {
            return this.right;
        }
    }

    public T Data
    {
        get
        {
            return this.data;
        }
    }

    // Other properties and methods not germane to this problem.
}

およびアシスタントクラス:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        // TODO: What goes here?
    }
}

私が見たい解決策はこれです:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        return tree == null
            ? 0
            : 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
    }
}

以下の知識を示しています:

  • ツリー(特にバイナリツリー)の仕組み
  • 二分木の再帰的定義
  • 再帰的メソッドとベースケースが再帰を停止する方法
  • 単一のノードを数えることの意味
  • 契約としてのインターフェース
  • (それほど重要ではない)C#構文の知識:
    • ジェネリック
    • 拡張メソッド
    • 三項演算子

それは拡張方法ですか?
グルシャン

この日と年齢では、はい。VS 2005でコーディングしていたので、スパース構文です。
ジェシーC.スライサー

元のクラスのソースコードがあるのに、なぜ拡張メソッドを使用するのですか?それは拡張メソッドの目的ではありません。
バティビックス

「レベルをさらに深くして、このクラスが実装するインターフェイスを候補者に見せることができたとします。要点は、元のクラスを変更する必要はないということです。一部のエントリーレベルの開発者は、要求を「簡単にする」ためにクラスに何かを追加したいと思うでしょう。
ジェシーC.スライサー

javaによく似た神聖ながらくた!
テスト

12

私にとって興味深いホワイトボードの議論を引き出した2つの質問は次のとおりです。

  1. 「Webブラウザーが生成されたページを取得する方法を好きなだけ詳しく説明してください」
  2. 「Java Hibernateの仕組みを説明してください」

それらは単純なものから始まり、その後、より複雑になります。


31
EHI、私は...私は... 1秒間あなたは12人の黒いキャンドルやヤギが必要だと思う答えを判断することであっても資格はないよ
Uberto

4
2つ目の方法は簡単です。OSはプロセッサキャッシュとスタック、RAMの内容をハードドライブに保存し、コンピューターの電源を入れたときに復元します。
マルフィスト

ただし、最初の質問の説明には数日かかる場合があります。
マルフィスト

@Malfist Java Hibernate永続フレームワークを意味していました。
ゲイリーロウ

2
@Paulスティーブンソンうん、ちょうど確かに...
ゲイリー・ロウ

8

ホワイトボードの質問としてパズルやデザインの質問を使うのは好きではありません。私は、候補者のコードを書く能力をテストする、単純明快な質問を好む。私のお気に入りは:

1)単一リンクリストを逆にする関数を作成します。(3つのポインターが必要であると認識するまでに時間がかかります。)

2)二分木が与えられたら、二分木の深さを見つけます。(この質問は、再帰的なコードを記述する能力をテストします。ベースケースが損なわれていないかどうかを確認します。)

3)整数の配列をバイナリ検索する手順を記述します。(Jon Bentley氏(プログラミングパール)のように、多くの人がバイナリ検索の記述を間違える傾向があります。その後、バグの発見、テストケースの記述、コードの実行などを追跡できます。)


+1、私はあなたのアプローチがビジネスプログラミングでほとんど使用されていないダイナミックなプログラムやそのような概念を誰かに尋ねるのは理にかなっていないのが好きです+ソリューションだけではなくコード品質にも重点を置くべきです。
オタク

私はデザインの質問を気にしませんが、趣味がパズルをしている男にインタビューしたことがあり、彼はいくつかの恐ろしい質問がありました。それは私が誰かに武道の質問をするようなものでした。
ボブマーフィー

おそらく、(3)で「ソートされた配列」を意味することを人々に知らせる必要がありますか?
HaveAGuess

7

私が働いていたある会社でこれを使用しました。

候補者に時間の追跡に使用する紙を渡しました。これは、1つまたは複数の部門で使用される実際のタイムシートでした。候補者に、より良い時間追跡ツールを作成するための設計プロセスを順を追って説明するように依頼しました。境界はなく、どの言語なども言わずに、候補者が「フルライフサイクル」でどれだけ優れているかを見たいだけです。彼らがどのように要件を収集したかについて、私たちに本当の洞察を与えました。データベーステーブルをどのように構成したか、どのようなUIを使用できるか。このタスクには明らかにコミュニケーションスキルが必要でした。それは通常、いくつかの大きなホワイトボードのある部屋で行われ、2時間も続きました。

私たちはこのプロセスを使用して数人を雇いました。彼らがタスクで本当にうまくいったなら、彼らは私たちのために本当にうまくいきました。彼らが限界的であり、とにかく彼らを雇うことにした場合(別のトピック)、彼らは限界的プログラマーでした。


6

プログラミングドメインに関連する問題を使用しています。

Webアプリケーションを開発する場合、レコードを削除するWebフォームをどのように作成するか、たとえばデータベースからレコードを削除するためにどのようなアプローチを取るかを確認したいと思います。これは、データベースの基本原則を知っているか、ユーザーとどのように対話して削除を検証するか、そしてソフト削除とは何かを知っているかどうかを教えてくれます。

私にはお気に入りがありません。私が選択する問題は、仕事によって大きく異なります。

インタビューで問題を完全に解決できるかどうか、使用するテクノロジーと言語、またはホワイトボード上でコードがどのように見えるかは気にしません。思考パターンを探しています。彼らが問題をどのように考え、解決するかを知っているかどうかを見たいです。


2
+1最後の段落では、すべてが重要です。通常、そのようなことで重要なのは答えではなく、そこにたどり着くまでの道です。私のすべての数学の先生がこれまでに「あなたの仕事を見せて!」
オーブリング

4

私のお気に入りは私の友人が使用したものでした。

最初の「n」個の素数を生成/印刷/保存する関数を書いて、それがどのように機能し、どれだけ効率的かを説明してください。

次の理由でうまくいきます:

  1. それはアルゴリズムの質問なので、インタビューを受けた人は考えてから考えを説明できる必要があります。そのため、彼らの脳がどのように機能するかを見ることができます。

  2. 言語に依存しません。

  3. 誰もそれを完全に正しく理解することはほとんどありません(通常は見逃すエッジケースがあります(通常1または2)、または彼らは負の数を処理しませんので、バグを処理し、間違っていると言われているのを見ることができます。

  4. ほとんどは単純だが非常に遅いふるいとして行われます(たとえば、80%の人がnをn未満の整数で除算することにより素数であるかどうかをチェックします)。空間/時間のトレードオフについて。例えば、「2で割り切れないことがわかっているのに、なぜ数値を4で割るのですか?」または「sqrt(n)未満のすべての素数で除算する必要があるだけでしたが、その数をどこかに保存する必要があるので、その意味は何ですか?)

彼らが正しい答えを得る必要はありません。誰かが自分の考えを考えて説明できるなら、彼らは良い候補になるための道のりです。


私はかつてインタビューの質問を受けましたが、そこでは非常に難読化されたCコードのブロックが渡され、それが何をしたのかを尋ねられました。方法については、他のすべての素数を出力する方法で非常にラウンドで。300人が応募し、彼らは私に仕事を提供してくれました。はい、+ 1、素数は良いチェックです。特に彼らがふるいを思いついた場合、それは計算の複雑さを空間の複雑さと引き換えにしますが。
オーブリング

1
1 ..プライムではありません

2
するThorbjörn@ -だけでなく、明らかに、私はこの問題を解決するために書かれて見てきましたルーチンの良い割合は、それがあることを私に言った
リス・ギブソン

その後、彼らにはバグがあります:)

3

私の工学学校のC試験の一部であり、休日から戻ってくるときに生徒を失敗させるための「ダミー」テストとして使用されたaff_zと呼ばれるものテスト全体を無効にします。モロニックの詳細に注意を払わせます。面接中に一度か二度それを再利用しました。

とにかく...正確な処方を忘れましたが、それはこのようなものでした...

Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:

 - if c is bigger or equal to 0, then print 'z' to standard output
 - if c is stricly smaller than 0 , then print 'z' to standard output
 - in any other case, print the letter 'z' to standard output

悲しいことは、答えがかなり明白な場合、非常に複雑なソリューションを思い付く学生だけでなく、何人かは失敗することさえあるということです。

信じられないかもしれませんが、それはインタビュー中にも起こりました。

面接でそれを実行するのはかなり面白かったです。一部の申請者は可能なブランチを書き始めて、何が間違っているのかを理解するでしょう(明らかに、口頭で尋ねるだけなら、彼らが話すときにそうすることはかなり理解できます...書面でそれを与えてください、私はそれが不可解であるとわかります...)

それは馬鹿げていますが、私はそれが最小限のスクリーニングだと思います(同様に、JSプログラマーを雇うとき、私は常に変数を宣言する方法を尋ねます、そして彼らの答えに応じてvarを使用するかどうかはまったく違います。かなり悲しい瞬間、正直に。)


1
インタビューの候補者がこれにin辱されたと感じたことはありますか?または、あなたは真面目なインタビューを行う代わりに、彼らの費用で単に楽しんでいたと思いますか?
ニコール

@Renesis:最初ににやにや笑いながら私を見ている人がいた。その一部はテストに失敗しました。一般的に、良い候補者はオフの場合笑います。たとえば、JSプログラマーの場合、面接の回答に「ダウ」と答えなかった候補者がかなり多くいましたがvariablename = variablevalue;、良い人は電話または直接会って笑って、違いが何であるか、またはウィットアウトするかを直接教えてくれましたvar)。
ヘイレム

1
@Renesis:さらに、一部の人が気分を害してもそれほど気にすることはできませんでした。差別的ではありません。もし彼らが気分を害したなら、私は彼らがテストを受けることや質問されることを好まない種類の人だと思います。応募者が実際に自分の費用で楽しんだと感じたことはありませんでした。私は通常、非常に簡単な質問をする前に謝罪さえします。それは、良い質問にとっては時間の無駄のように感じるかもしれないからです。しかし、それは私にとって時間の無駄ではありません。長い目で見れば、彼らに尋ねることはないでしょう。
ヘイレム

@Renesis:そうではないこともよくありますが、にやにや笑い/不快な表情の後に私が得たのは、恥ずかしい表情と、失敗したか、テスト全体のブランチを書き始めた人からの謝罪です。はい、このテストを提供するのは楽しいですが、正当な理由がない場合は提供しません。
ヘイレム

個人的に、私はそれを読むときに精神的な顔面を持っているだろうし、誰かが彼をからかうためにインタビュアーのために質問を書いたのだろうかと思うだろう。
ワイルドピーク

3

画像を含む多くの動的なWeb作業を行う組織として、仕事に関連するジオメトリの質問をするのが好きです。いずれにせよ、幾何学的な質問をする傾向があります。それは、素晴らしく視覚的で、問題を自分の作業を視覚的に提示し、系統的に作業する候補者の能力を示すことができる優れた数学テストだと思うためです。

上級候補者のために、私は時々次の質問をします:

この画像は三日月を示しています。三日月の幅は、BからDまでは9cm、EとFの間は5cmです。Cは大きな円の中心です。

a)三日月の面積を計算してください。 三日月の数学の質問

b)任意のサイズから内側の円に収まるように画像のサイズを変更するために必要な計算を記述し、中心点がわかっている場合は円内に配置します。

簡単な質問のために、私は通常同じ種類の質問をしますが、「正方形の中の円の中の正方形」の例を使用します。これは非常に簡単ですが、完全な代数を期待します。

正方形の中の円の中の正方形

さらに、可変長データセットのすべての組み合わせを生成するアルゴリズムをノックアップするように依頼する傾向があります。


1
a)の答えは128.75?(間違いを犯したかどうかわかりません)。私はそれが好きですが、しかしそれは幾何学についてです。
ホアンロング

2
また、コメントの遅れて申し訳ありません。私は原則として二重投票するのは好きではありませんし、二重にそうする理由もコメントせずに。私のダウン票は質問そのものに関するものではなく、確かにあなたの目的を持っています。プログラミングのインタビューで適切な文脈があるとは思いません。
フィリップレーガン

7
-1は、ジオメトリがJust In Time Learningの優れた候補であり、高品質のソフトウェアを作成する能力を反映していないためです。
マルフィスト

2
私はこの問題を楽しんだ。パート(a)の解決策を共有しても構わないことを願っています。直径は9cm異なるため、内側の円の半径がrの場合、外側の円の半径はr + 4.5です。三日月の面積は、円の面積の差です:pi(r + 4.5)^ 2-pi * r ^ 2。残っているのはrを見つけることだけです。Cをポイント(0,0)として定義すると、ポイントEは(0、r-0.5)になります(CEは大きい方の半径より5cm小さいため)。内側の円は右に4.5cmシフトしているため、その方程式は(x-4.5)^ 2 + y ^ 2 = r ^ 2です。(x、y)=(0、r-0.5)を差し込み、rを解きます。
ティムグッドマン

2
+1ジオメトリを必要とする仕事には良い質問だと思うからです。数式にプラグインするだけでなく、多くの推論が含まれます。しかし、質問が適し質問を要求しません-それは私が彼らがいないので、多くの10年間で、円について考えなければならなかったとして持っているという理由だけで、最大トリップしたいいくつかの良いプログラマを知っている、と述べたいずれかの開発者インタビュー。現在トップ投票のSQLの質問(私も気に入っています)は、少なくともジョブ固有のものです。
ティムグッドマン

3

私が見た中で最高のFizzBu​​zzの答えは次のとおりです。

SQL Server 2008

;WITH mil AS (
 SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
 FROM master.sys.all_columns as c
 CROSS JOIN master.sys.all_columns as c2
)                
 SELECT CASE WHEN n  % 3 = 0 THEN
             CASE WHEN n  % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
        WHEN n % 5 = 0 THEN 'Buzz'
        ELSE CAST(n AS char(6))
     END + CHAR(13)
 FROM mil

C#(シンプル)

foreach (int number in Enumerable.Range(1, 100))
{
    bool isDivisibleBy3 = (number % 3) == 0;
    bool isDivisibleBy5 = (number % 5) == 0;

    if (isDivisibleBy3)
         Console.Write("Fizz");

    if (isDivisibleBy5)
         Console.Write("Buzz");

    if (!isDivisibleBy3 && !isDivisibleBy5)
         Console.Write(number);

    Console.WriteLine();
}

C#(賢い)

 Enumerable
  .Range(1, 100)
  .Select(i =>
    i % 15 == 0 ? "FizzBuzz" :
    i % 5 == 0 ? "Buzz" :
    i % 3 == 0 ? "Fizz" :
    i.ToString())
  .ToList()
  .ForEach(s => Console.WriteLine(s));

1
これが記述されている特定のSQL方言を追加することができます。

機能的なスタイルで素敵に見えます。
オーブリング

2

面接を受けた候補者の中からいくつかを探します。オンラインで説明できない理由から、私たちはかなり貧しい候補者を獲得し、それを期待するようになりました。それでも、私は探します:

  • デザインの認識。

    「番号の説明(cell / home / work / etc。)などの複数の電話番号を持つことができる姓と名の連絡先を持つアドレス帳プログラムのテーブル構造を表示してください」

    ここではUML 2.0の仕様図を探しているわけではありませんが、ここでの単純なバブル図は問題ありません。合理的である限り。

  • データベース(SQLなど)の操作に関する知識

    1. 姓が「smith」である人のすべての電話番号を取得するクエリを作成します
    2. データベース内のすべての顧客と、姓が「smith」である顧客の電話番号を取得するクエリを作成します
  • テストの知識

    public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)以前のクエリの結果を返すシグネチャを持つメソッドが存在すると仮定します。メソッドにnullを渡すと、NullReferenceExceptionがスローされます。この機能を実証するテストを作成します。

    GetPhoneNumbersが姓 "smith"を持つ人に対して(123)456-7890の自宅電話番号を返すことを示すテストを作成します。

  • コードの書き方に関する知識

    作成したテストの要件を満たすメソッドを実装します。


応募者の数と質を考慮して、これまで真剣に応募したすべての人にインタビューしました。私は誰も雇っていない。


SQL#2では、これをすべて1つのクエリで実行することについて話していますか?目的は、左/右または内部結合の理解を測定することだけですか?
ニコール

@Renesis:はい。
スティーブンエバーズ

2

私は通常、彼らに彼らが取り組んだ最後のシステムのブロック図をスケッチさせ、ブロック間の関係について尋ね、彼らに彼らが働いていた/担当しているブロックについて詳しく説明させました。このエクササイズから多くのことを学ぶことができます。たとえば、彼の小さな領域を超えてどのように見えるか、彼が演じている「場所」を知ることは彼にとってどれほど重要か、また彼が果たしていた役割について学ぶことができます役割。


2

次の問題のアルゴリズムを記述しますnを指定するとn個のノードを持つ(一意の)二分木の総数を出力します。

したがって、n = 0およびn = 1の場合、答えは1です。n = 2の場合、ルートノードが2つあり、次に左または右の2番目のノードがあります。

設計手法についての洞察を得て、再帰やメモ化、または動的プログラミングソリューションについて考えているかどうかを確認できます。

[ 関連するが異なるバイナリ検索ツリーのケースについては、このStackOverflowの説明も参照してください。]


動的プログラミングを知らないUIプログラマーは悪いプログラマーですか?ちなみに、動的プログラミングを思い出せないビジネスプログラマは悪い人ですか?topcoderの10代の若者の多くは、動的プログラミングの問題を経験しますが、彼らが書いたコードを見てください。
オタク

@Geek:「ホワイトボード」の問題は、誰かの思考プロセスを見る方法であることを忘れないでください。動的プログラミングの問題は、特にGoogleで非常に人気があるため、この議論に含まれるべきです。
マクニール

私は同意しませんが、2つの質問があります。1.未知の問題を解決しますか?DPの問題は、最近過去にいくつかの問題を解決したか、または大学の概念をまだ覚えている場合、公園を散歩します。それを忘れてしまった人は、ホワイトボードでうまく行かないでしょう。2.誰かが問題の解決に苦労している場合、コードの品質を定量化する方法はありません。LinkListやStringsやArraysのようなものに問題を与えて、その人が問題を解決してコードを書くことができるようにするとどうでしょう。
オタク

一部の企業がそうするかもしれないが、私は必ずしもインタビューする人がそれを正しくすることを期待しません。
マクニール

@Geek:「動的プログラミングを知らないプログラマーは悪いプログラマーですか?」- はい。そうは言っても、動的プログラミングの考え方は、慣れていない場合でも簡単ではないことに同意します。しかし、それを知ることは絶対必要です。
コンラッドルドルフ

2

ソフトウェア開発者にインタビューする場合は、ソフトウェアを設計し、各行にフルネームを含む任意の大きなファイルから重複エントリを削除するためのハードウェア要件を説明するよう依頼します。問題の説明の一部を意図的に曖昧にしておきます。次に、要件、さまざまなトレードオフ、データ構造とアルゴリズム、I / O(セカンダリストレージ)、ソフトウェアとハ​​ードウェアテクノロジー、スケーラビリティなどの分析と明確化を理解しているかどうかを確認するように彼に挑戦します。

これは小さなながらも挑戦的な問題であり、多くのコンピューティング分野における応募者の知識と能力を明らかにするものだと思います。


2

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

多くの人がこれにこだわる可能性があります。何らかの解決策が与えられた場合-通常は再帰を使用します。その後:

Implement the same via 'for'-loop

両方のタスクを完了できないフェローの人数-候補者の50%
それが私がそれを好む理由です:)


最初の実装がforループを介して行われた場合はどうなりますか?
ダークナイト

2
再帰バージョンの実装が提案されています。通常、for-loop guysが再帰バージョンを正常に実装した後。
alexb

または、これを単一のステートメントとして実装できます fib(n)=round(power(PHI,n)/SQRT5)。PHIとSQRT5は、それぞれ黄金比(1.618 ...)と5の平方根を表す定数です。
-oosterwal

2

私が行くデータベースの場合:

表:物事

ID名
1ボドキンヴァンホーン
2フーズフーズ
3フーズフーズ
4ホットショット
5 Marvin O'Gravelバルーンフェイス
6スニム
7 Marvin O'Gravelバルーンフェイス
8 Marvin O'Gravelバルーンフェイス
9デイブ

名前に基づいてこのようなテーブルを重複排除するSQLを記述します(どのIDを取得してもかまいませんが、返されるIDはその名前に対して有効でなければなりません)。そのため、正しいSQLが適用されると、テーブルは次のようになります。

表:物事

ID名
1ボドキンヴァンホーン
2フーズフーズ
4ホットショット
5 Marvin O'Gravelバルーンフェイス
6スニム
9デイブ

私はそれが好きです:

  • 重複排除は現実の問題です
  • たくさんの方法があります
  • これらの方法のほとんどすべてでは、(少し)より複雑なSQL(基本的にはGROUP BYおよびHAVING)を理解するか、複数の単純なステートメントを連鎖させて推論する能力が必要だと思います。
  • たとえ構文などに苦労しているとしても、この最後のビットのために、彼らが何を考えているのかを彼らに尋ね、それを通してそのように話すことができます。
  • スース博士を参照

(これは私がこれを行ういくつかの完全に些細な方法があることを見つけた場所であり、私は長年にわたってそれを複雑化してきました)。


1
何が「ささいなこと」としてカウントされるのか分からないのではないかと思いSELECT min(ID), Name FROM Things GROUP BY Nameます。
ティムグッドマン

@Tim-それはあなたにすべてのカウントを与えます。重複しているものだけが必要です。結果を手動で編集してもカウントされません。数百万行にスケーリングされると仮定してください。これは簡単な問題ですが、私の経験では、SQLを知っていると主張する人の80%は、最初の突き刺すことさえできません。
ジョンホプキンス

@Jon:「それがすべての数を数える」という意味がわかりません。サンプルソリューションからは、必要なのは各個別名ごとに1行であるように見えます。あなたのコメントから、あなたはおそらくのようなものを意味しているように思えHAVING count(Name) > 1ますが、サンプルの答えは、ボドキンヴァンホーン、ホットショット、スニム、デイブを省略するべきだと思います。
ティムグッドマン

@Tim-あなたは正しい、それは本当に不明瞭だ。数分後に編集します。
ジョンホプキンス

1
私はこれを行うと思います:DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)。望ましい解決策はありますか?
ティムグッドマン

2

私のお気に入りのC ++ホワイトボードの問題は、候補者に実装させることです

Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;

これから私は学ぶことができます

  • 候補が、戻り値の型でオーバーロードできないことを認識している場合(ジュニアレベルのC ++の表示)
  • 候補者が一時的な値を返し、キャスト演算子を実装する方法を知っている場合(中間レベルC ++の表示)
  • 候補者が基本的なベクトル計算を行える場合(アプリケーションドメインにとって重要)

2

標準の52カードデッキをどのように表現しますか?どのプログラミング言語でも問題ありません。どのようにカードをシャッフルしますか?


vector <Card> with C ++ 'shuffle function :)
rightfold

1

私のお気に入りは、printfのプロトタイプを尋ねることから始めることです。次に、1文字を出力する低レベルAPI printc(char c)を指定して、printfを実装します。スタックがCPUの一部であるなど、あらゆる種類の興味深い応答を提供します。ご想像のとおり、私はCと組み込みのバックグラウンドから来ました。


「スタックはCPUの一部です」ということはわかりません。
バルジャック

コンピュータアーキテクチャについて何かを知っている人なら誰でも知っているでしょう。私にはまったく関係がないので、その男は彼の無知を示​​しています。
マイケルK

@aufather:私の記憶が正しければ、varargs()そのような関数を呼び出す必要があります。私は正しいですか?少し前に言ったのは一度だけです。
マイケルK

@barjak-printfの実装を開始したら、スタックにアクセスする必要があり、スタックがCPUにあるという応答があります。
-aufather

@Michael-組み込みの世界では、プラットフォームのアーキテクチャを本当によく知る必要があります。したがって、この質問は、かなり早い段階で無知な人をすぐに取り除いてしまいます。
-aufather

1

200匹の魚が入ったボウルがあります。これらの魚の99%はグッピーではありません。残りの2%がグッピーになるように、何匹の魚を取り除く必要があります。作品を見せてください。

これは混乱を招く要件です。同じ質問の中で視点を複数回変更することは、このように言われます。実際に何が起こっているのかを理解できるかどうかを確認するためのものです。

何人が間違っているのか驚くでしょう。


4
ボウルに2つの12インチオスカーを追加すると、すぐに98%のグッピーが削除されます。
オタク

グッピーを削除するとどうなりますか?

1
1%グッピー= 200 x 1%= 2(200-2 = 198他の魚)、2 = 2%、残りの魚= 98%= 98(1:1)。98 = 198-100 => answer = 100。[他の魚を選択的に選ぶことができると仮定します。グッピーを削除する場合、他の答えがあります。]良い質問です。プログラマーにとって子供の遊びであるべきですが、それをうまく処理できる人が少ないことに驚くでしょう。
オーブリング

1

私にはいくつかのお気に入りがありますが、ここにほとんど常に出てくるカップルがあります。私はほとんどの場合、最終ラウンドの技術(C ++)インタビューを行っているので、新しい興味のある分野につながる、より長く、よりオープンな質問を好んでいます。「正しい」答えはありません。他の会話を開くだけです。

1)基本的な共有ポインターの実装、tr1またはboostの実装での共有ポインターと比較して欠陥がある場所の説明、使用方法など

2)コードレビュー。経験豊富な採用の場合、設計上の問題、エラー、コーディングの恐怖、潜在的な保守性の問題について、提供されたコードを自信を持って確認できることが期待されます。また、もちろん、どのように修正するか。そして、時には彼らが撃shootingしているジュニア開発者にそのメッセージをどのように伝えるか。


1

私に使用されて以来、私が使ってきた質問の1つは次のとおりです。

1から100までのすべての数値を印刷する関数を作成します。

私がそれを使用している理由の大部分は、その後、そこに解決策を取り、さまざまな方向に移動できるという事実によるものです。

1から1000、10000、またはnまでのすべての数値を出力するように関数を変更するにはどうしますか?

これらの質問に対する回答は、変化する要件にどのように対応するか、またパフォーマンスの考慮事項を認識できるかどうかについての洞察を提供します。強力な候補者は、関数が呼び出される頻度に必要な関数に関する質問で応答する場合があります。

別の方向に移動する:

この関数が1分間に数回呼び出され、パフォーマンスが懸念される場合、どのように変更しますか?

私は彼らの側面的な思考をチェックする方法としてこれを使います。最大値が大きくなると素数の計算が遅くなる可能性があるため、解決しようとしている問題に基づいて調整されたある種の計算済みまたは事前計算済みのルックアップテーブルを使用する方が理にかなっている場合があります。


1

ここにいくつかの考えを引き起こすものがあります-それは簡単で、少しの数学を含み、基本的なコンピューター設計(オーバーフロー、数値表現など)の候補者の知識をチェックします:

入力として整数X、Yのペアを取り、X * Yが10で均等に割り切れるかどうかを判断するプログラム(またはプロシージャ)を作成します。あなたのマシンで。


サンプルソリューション:


T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}

0

次の方法を入力します。PS番号のモードは、(リスト内の)最も多く出現する番号です。

public int getMode(List<Integer> numberList) {


}

これは、コードが効率的であることを確認するためです。


-2

比較的大きいスペアマトリックスをどのように表現しますか。たとえば、1000x1000で、最大で100の非ゼロエントリがありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.