가장 좋아하는 화이트 보드 인터뷰 문제는 무엇입니까? [닫은]


52

제목에서 알 수 있듯이 가장 좋아하는 화이트 보드 인터뷰 문제는 무엇이며 왜 효과가 입증 되었습니까?

주니어, 시니어, 자바, C, 자바 스크립트, PHP, SQL, 의사 코드 등


4
내가 싫어했던 문제는 아인슈타인의 퍼즐이었다. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html 30 분 안에 할 수 없었습니다. 그러나 나는 화가,이 발견되었다 : games.flowix.com/en/index.html를 나는 20 분 평균에 더 열심히 6 × 6 × 6 문제를 할 수 있도록 훈련 그래서. 30 분 안에 5 x 5 x 5를 처리 할 수 ​​있다고 생각합니다. 고용주가 어리석은 퍼즐을 던지면 무엇이든 기억하고 다음에 다시 에이스 할 것입니다. 좋은 퍼즐이 너무 많습니다.
직업

20
@Job : 직원이 업무를 수행하는 방법에 대한 정보는 없습니다. 물론, 실제 작업을 수행하는 대신 이러한 종류의 퍼즐을 해결하는 데 모든 작업 시간을 소비하지 않는 한.
Robert Harvey

1
@ 로버트 하비 당신이 퍼즐을 해결하는 것보다 다른 방법으로 돈을 버는 사업에 있다는 것을 의미합니까? 나는 전혀 몰랐다 ...;) 그 퍼즐은 재미있다. 부수적으로, 내가 사용한 실제 IQ 테스트를 위해 일했던 회사 는 심사의 첫 단계로 사용되었습니다. 단순히 후보자를 선별하는 것이 아니라 최고의 후보자를 분리 할 수있는 좋은 화이트 보드 질문을 찾고 싶습니다.
니콜

4
@Renesis : 개발자는 퍼즐을 풀면 문제 해결 및 분석 기술을 식별하는 방법을 알 수 있지만 개발자는 해당 솔루션을 코드로 변환하는 방법도 알아야합니다. 퍼즐을 푸는 것은 그 실행의 절반 만 보여줍니다. Rubix 큐브를 해결하고 Rubix 큐브를 해결하기위한 알고리즘을 작성하는 것의 차이점입니다.
Robert Harvey

@Robert Harvey 본인은 생각 문제가 아니라 코딩 문제를 구체적으로 찾고 있습니다.
니콜

답변:


22

저는 후보자 가 일상 업무에서 실제로 겪고있는 문제에 대한 해결책설계 하도록 요청합니다 . 그렇게하면서 나는 나와 후보자 사이에 대화를 만들려고합니다. 나는 마치 이전에 문제를 생각한 적이없는 것처럼 그가 만들고있는 디자인에 대해 논의하려고합니다.

내가 평가하려고하는 것은 우리가 서로를 이해할 수 있는지, 혼란없이 기술적 문제에 대해 이야기 할 수 있는지 여부입니다.

구체적인 예

(자바 데스크톱 개발자 용)

웹 브라우저탐색 히스토리 (이전 페이지, 다음 페이지, 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 번입니다. 귀하의 문서는 행마다 하나 개의 키워드를 가지고, 그래서 당신은 모두 "블루"와 "노란색"동일한 셀 수 없습니다 탭은 의도적으로 알고있다
glasnt

8
죄송합니다! 인터뷰에서 (4)에 빠지는 것을 볼 수 있습니다. @Job : 면접관 으로서 후보자에게 질문에 대해 설명 해달라고 요청하고, 문제를 다루는 방법을 찾기 위해 문제를 우연히 해결하기를 바랍니다. (보통 첫 번째 시도에서 질문을하는 후보자 이상을 알려줍니다.)
peterchen November

3
@Renesis, 나는 이것이 정말로 깊이 파고 있는지 확신하지 못한다. 누군가가 기본적인 SQL 쿼리 기술을 가지고 있는지 알아내는 데 꽤 좋습니다. 나는 요즘 이러한 기본 기술을 가진 개발자가 몇 명인지에 놀랐습니다.
Mark Freedman

2
@ jk01, 나는 이것에 대해 오래된 학교 태도를 가지고 있지만, 다재다능한 개발자는 코드를 통해 액세스하지 않고 최소한 쿼리를 실험하여 도메인을 이해하려면 DB 지식이 있어야합니다. 이것이 없으면 개발자는 상당히 중요한 사각 지대를 갖게됩니다. 또한 시스템 지원 및 문제 해결에 매우 유용합니다. 추상화는 개발을 단순화하고 생산성을 높이는 데 도움이되지만, 자주 추상화되기 때문에 너무 많은 가정을 보았습니다. ) 내가 갈 수 있지만, 내가 확실히 다른 곳에서 일어나고있어 완전히 다른 논쟁이 될 수있다
마크 프리드먼에게

4
@ back2dos-봐, 대답 할 수 없어서 화 내지 마라. 이것을 단순화하는 다른 기술이 많이있을 수 있지만, 우리는 많은 SQL 데이터베이스를 사용하며 인터뷰 기술 질문에 대답 할 필요가없는 이유를 변명하지 않고 우리가 사용하는 기술을 사용하는 방법을 아는 사람들을 모집합니다. .
JohnFx

20

"민감한 디테일을 밝히지 않고 마지막으로 작업 한 프로젝트의 디자인을 화이트 보드에 그린다."


디자인을 어떻게 정의 하시겠습니까? 수업 다이어그램을 찾고 있습니까? 다른 UML 다이어그램? 계층의 기본 스케치?
justkt

1
나는 그들을 baloongrams라고 부른다. ;) 그냥 고드름을 그리고 이름을 넣고 명명 된 화살표로 연결하십시오. 나는 그의 응용 프로그램에 관심이 없지만 그가 그것을 이해한다는 사실에 관심이 있습니다.
Uberto

5
+1. 이전에 직장을 가졌던 사람들에게는 이것이 당신이 할 수있는 가장 좋은 일 중 하나입니다. 그들이 프로젝트의 구조를 설명 할 수 있다면 이미 많은 가치가 있습니다. 왜 그러한 방식으로 구성되었는지 또는 어떤 일을 더 잘 수행 할 수 있는지에 대한 아이디어가 있다면 이것은 실제로 큰 장점입니다.
back2dos

3
@justkt : 중요한 것은 인터뷰 대상자가 정보를 종합적으로 얻는 것입니다. 그다지 중요하지 않습니다. 나는 UML을 정말로 알고 있고, 그것에 대해 설명 할 수없는 사람들과, 약간의 구불 구불 한 라인으로 복잡한 시스템을 설명 할 수있는 사람들을 만났다.
back2dos

2
지구상에서 민감한 세부 사항을 밝히지 않고 프로젝트 디자인을 그리는 사람은 누구입니까?
Nemanja Trifunovic

14

구현 strcpy, strcmp친구.


4
후보자들에게 구현을 부탁드립니다 atoi().
chrisaycock

2
얼마나 많은 사람들이 구현할 수 없는지 놀랄 것 strdup()입니다.
Tim Post

10
일자리가 C 프로그래머를위한 것일 경우에만 그렇습니다.

현재 직업에 대한 인터뷰에서 면접관은 내게 strrev()역전 기능 을 구현 하거나 요청했습니다 . 저의 화이트 보드 솔루션이 그들에게 깊은 인상을 주었고 지금 일하고 있습니다.
Gulshan

@crisaycock atoi ()는 쉽습니다. itoa ()는 사악하다
Michael Brown

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에서 코딩 했으므로 희소 한 구문입니다.
Jesse C. Slicer

원래 클래스의 소스 코드를 받았을 때 왜 확장 메서드를 사용합니까? 그것은 확장 방법이 아닙니다.
Batibix

'더 깊이 들어가고 후보 에게이 클래스가 구현하는 인터페이스를 보여줄 수 있다고 가정하십시오. 요점은 원래 클래스를 수정할 필요가 없다는 것입니다. 일부 엔트리 레벨 개발자는 요청을 "쉽게"만들기 위해 클래스에 항목을 추가하려고합니다.
Jesse C. Slicer

자바처럼 보이는 거룩한 쓰레기!
테스트

12

저에게 흥미로운 화이트 보드 토론을 이끌어 낸 두 가지 질문은

  1. "웹 브라우저에서 생성 된 페이지를 얻는 방법을 원하는만큼 자세히 설명 할 수 있습니다"
  2. "Java Hibernate 작동 방식을 설명하십시오"

그들은 단순하게 시작한 다음 점점 더 복잡해집니다.


31
에히, 나는 대답을 판단 할 자격이 없다 ... 나는 두 번째 촛불 12 검은 양초와 염소가 필요하다고 생각합니다.
Uberto

4
두 번째는 쉽습니다. OS는 프로세서 캐시 및 스택과 RAM의 내용을 하드 드라이브에 저장 한 다음 컴퓨터를 다시 켤 때 복원합니다.
Malfist

그러나 첫 번째 질문은 설명하는 데 며칠이 걸릴 수 있습니다.
Malfist

@Malfist 저는 Java Hibernate 퍼시스턴스 프레임 워크를 의미했습니다.
Gary Rowe

2
@Paul Stephenson 그래,하지만 확실하게 ...
Gary Rowe

8

퍼즐이나 디자인 질문을 화이트 보드 질문으로 사용하고 싶지 않습니다. 후보자의 코드 작성 능력을 테스트하는 간단하고 간단한 질문을 선호합니다. 내가 가장 좋아하는 것은 :

1) 단독으로 연결된 목록을 뒤집는 함수를 작성하십시오. (3 개의 포인터가 필요하다는 것을 깨닫기까지 시간이 걸립니다.)

2) 이진 트리가 주어지면 이진 트리의 깊이를 찾으십시오. (이 질문은 재귀 코드를 작성하는 능력을 테스트합니다. 기본 사례가 그대로인지 확인할 수 있습니다.)

3) 정수 배열을 이진 검색하는 절차를 작성하십시오. (Jon Bentley와 마찬가지로 (Programming Pearls에서) 많은 사람들이 이진 검색을 작성하는 데 실수를 범하는 경향이 있습니다. 그런 다음 버그 찾기, 테스트 케이스 작성, 코드 실행 등을 수행 할 수 있습니다.)


+1, 나는 당신의 접근 방식이 비즈니스 프로그래밍에 거의 사용되지 않을 때 동적 프로그램 또는 이와 같은 개념을 누군가에게 물어 보는 것이 타당하지 않다고 생각한다.
Geek

나는 디자인 질문을 신경 쓰지 않지만, 한 번 취미로 퍼즐을하고있는 남자와 인터뷰를했고, 그는 끔찍한 질문을했습니다. 그것은 누군가에게 무술 질문을하는 것과 같았습니다.
밥 머피

아마도 사람들이 당신이 (3)에서 "정렬 된 배열"을 의미한다는 것을 알아야합니까?
HaveAGuess

7

우리는 내가 일한 한 회사에서 이것을 사용했습니다.

우리는 후보자에게 시간 추적에 사용되는 종이를 건네 주었다. 하나 또는 우리 부서에서 사용하는 실제 작업 표였습니다. 우리는 응시자에게 더 나은 시간 추적 도구를 만들기위한 디자인 프로세스를 안내해달라고 요청했습니다. 경계가없고, 어떤 언어 등을 말하지 않았으며, 후보자가 "전체 수명주기"에 얼마나 능숙했는지 알고 싶었습니다. 이를 통해 요구 사항을 어떻게 수집했는지 실제로 알 수있었습니다. 데이터베이스 테이블을 구성한 방법, 수행 할 UI 종류 이 작업에는 의사 소통 기술이 분명히 필요했습니다. 일반적으로 여러 개의 큰 화이트 보드가있는 방에서 이루어졌으며 2 시간 동안 지속되었습니다.

우리는이 과정을 사용하여 여러 사람을 고용했고 그들이 실제로 그 일을 잘 수행했다면 그들은 우리를 위해 정말 잘했습니다. 그들이 한계가 있고 어쨌든 (별도의 주제) 그들을 고용하기로 결정했다면 그들은 한계 프로그래머였습니다.


6

프로그래밍 도메인과 관련된 문제를 사용합니다.

웹 응용 프로그램을 개발하는 경우 레코드를 삭제하는 웹 양식을 작성하는 방법과 데이터베이스에서 레코드를 제거하기 위해 어떤 방법을 사용해야하는지 알고 싶습니다. 기본 데이터베이스 원칙을 알고 있는지, 사용자와 상호 작용하여 삭제를 확인하는 방법 및 소프트 삭제가 무엇인지 알 수 있습니다.

나는 좋아하는 것이 없습니다. 내가 선택한 문제는 직업에 따라 크게 다릅니다.

인터뷰에서 문제를 완전히 해결할 수 있는지, 어떤 기술과 언어를 사용하는지, 화이트 보드에서 코드가 어떻게 엉망인 지에 대해서는 신경 쓰지 않습니다. 생각 패턴을 찾고 있습니다. 그들이 생각하고 문제를 해결하는 방법을 알고 있는지 알고 싶습니다.


2
+1 마지막 단락은 모두 중요합니다. 일반적으로 그런 것들에서 중요한 대답은 아니지만 거기에 도달하는 길입니다. 모든 수학 교사들이 "당신의 작업을 보여주세요!"
Orbling

4

내가 가장 좋아하는 친구는 내 친구였다.

첫 번째 "n"소수를 생성 / 인쇄 / 저장하고 작동 방식과 효율성을 설명하는 함수를 작성하십시오.

다음과 같은 이유로 잘 작동합니다.

  1. 알고리즘 질문이므로 인터뷰 대상자가 생각하고 생각을 설명 할 수 있어야합니다. 따라서 뇌가 어떻게 작동하는지 확인할 수 있습니다.

  2. 언어 독립적입니다.

  3. 거의 모든 사람이 그것을 제대로 얻지 못합니다 (일반적으로 빠진 경우 (1 또는 2 보통) 또는 음수를 처리하지 않으므로 버그를 처리하고 잘못되었다는 것을 알 수 있습니다.

  4. 대부분 간단하지만 매우 느린 체로 사용합니다 (예 : 사람들의 80 %가 n을 n보다 작은 모든 정수로 나눔으로써 주요한 것입니다). 이는 알고리즘 기반의 알고리즘을 개선하는 방법에 대한 대화의 범위를 넓 힙니다. 시공간 트레이드 오프 (off / off)에 관한 것, 예를 들어 "2로 나눌 수 없다는 것을 이미 알고 있다면 왜 4를 나눕니 까?" 또는 "sqrt (n)보다 작은 모든 소수로만 나눌 필요가 있지만 그 숫자를 어딘가에 저장해야하므로 그 의미는 무엇입니까?")

그들이 정답을 얻을 필요는 없습니다. 누군가 자신의 생각을 생각하고 설명 할 수 있다면 그들은 좋은 후보자가되기위한 길을 먼 길입니다.


나는 한 번 인터뷰 질문을 받았는데, C 코드 블록이 난독 화되어 그 일을 알아 내도록 요청했습니다. 방법에 대한 매우 둥근에서 다른 모든 소수를 인쇄했습니다. 300 명을 신청했고 그들은 나에게 일자리를 제공 한 것 같습니다. 저는 그 가치를 얻는 것과는 반대로 그 목적이 무엇인지 말 해준 유일한 후보였습니다. 예, +1입니다. 소수는 좋은 확인입니다. 특히 체를 만들어내는 경우 공간 복잡성에 대한 계산 복잡성을 상쇄합니다.
Orbling

1
1이 소수가 아닙니다.

2
@ Thorbjørn-분명히, 그러나이 문제를 해결하기 위해 작성한 루틴의 좋은 비율은 나에게 다음과 같이 말했습니다.
Rhys Gibson

그때 그들은 버그가 있습니다 :)

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 사용 여부에 따라 var를 사용하여 차이가 나는지 여부에 따라 답변에 따라 달라집니다. 솔직히.)


1
인터뷰에 응한 사람들이 이것에 의해 모욕감을 느낀 적이 있습니까? 아니면 진지한 인터뷰를하는 대신 비용을 들여 재미있게 놀았다 고 생각하십니까?
Nicole

@Renesis : 나는 몇 가지 능글 맞은 웃음을 먼저 보았습니다. 그 중 일부는 테스트에 실패했습니다. 좋은 후보자들은 일반적으로 웃음을 터뜨립니다. 예를 들어 JS 프로그래머에게는 "duh"로 인터뷰 답변에 실패한 많은 후보자가 variablename = variablevalue;있었지만 좋은 사람은 전화 나 직접 대면 웃고 직접 다른 사람과 함께 또는 위트가 무엇인지 말해 줄 것입니다. var).
haylem

1
@Renesis : 게다가, 일부 사람들이 기분을 상하게하면 더 이상 신경 쓰지 못했습니다. 어떤 식 으로든 차별적이지 않습니다. 그들이 화를 내면 시험에 응시하거나 질문을 받고 싶지 않은 사람이라고 가정합니다. 나는 정말로 그들의 비용으로 재미를 느낀다고 생각한 지원자가 없었습니다. 나는 좋은 질문에 시간 낭비처럼 느껴질 수 있으므로 매우 간단한 질문을 하기 전에 보통 사과 합니다. 그러나 문제는 시간 낭비가 아닙니다. 장기적으로는 요구하지 않을 것이다.
haylem

@Renesis : 더 자주는, 그렇지 않은 경우, 능글 맞은 웃음 / 웃음 / 불쾌한 표정을 얻은 후에는 부끄러운 표현과 실패한 사람의 사과와 사과가 쓸모 없다는 것을 깨달았을 때 전체 테스트에 대한 브랜치를 작성하기 시작했습니다. 그렇습니다. 나는이 테스트를하는 것이 재미 있지만, 그럴만한 이유가 없다면 그것을주지 않을 것입니다.
haylem

개인적으로, 나는 그것을 읽을 때 정신 얼굴이 있고 다른 사람이 면접관이 그를 놀리도록 질문을했는지 궁금 할 것입니다.
wildpeaks

3

이미지와 관련하여 많은 동적 웹 작업을 수행하는 조직으로서, 당신이 찾고있는 것에 정말로 달려 있습니다. 나는 작업과 관련된 지오메트리 질문을하는 경향이 있습니다. 어쨌든 지오메트리 질문을하는 경향이 있습니다. 좋은 시각적 테스트는 훌륭하고 시각적이며 문제를 통해 시각적으로 작업을 수행하고 체계적으로 작동하는 후보 능력을 보여줄 수 있기 때문입니다.

고급 지원자에게는 때때로 다음과 같은 질문을합니다.

이 이미지는 초승달을 보여줍니다. B에서 D까지의 초승달 너비는 9cm이고 E와 F 사이는 5cm입니다. C는 더 큰 원의 중심입니다.

a) 초승달 면적을 계산하십시오. 초승달 수학 질문

b) 주어진 크기에서 내부 원에 맞게 이미지 크기를 조정하는 데 필요한 계산을 설명하고 중심점이 알려진 경우 원 안에 배치하십시오.

더 쉬운 질문을 위해 나는 보통 같은 종류의 질문을하지만 "사각 안의 원 안에있는 사각형"예제를 사용합니다. 이것은 매우 쉽지만 완벽한 대수를 기대합니다.

사각형 안에있는 원 안에 사각형

그 이상으로, 나는 그들에게 가변 길이 데이터 세트의 모든 조합을 생성하는 알고리즘을 두드 리도록 요구하는 경향이 있습니다.


1
a)의 답은 128.75입니까? (내가 실수했는지 모르겠다). 나는 그것을 좋아하지만 기하학에 관한 것입니다.
Hoàng Long

2
또한 의견이 지연되어 죄송합니다. 나는 원칙으로 의견을 내리는 것을 좋아하지 않으며 이유에 대해 언급하지 않고 두 배로 그렇게 싫어합니다. 내 downvote는 질문 자체에 관한 것이 아니며, 분명히 당신을위한 목적을 가지고 있습니다. 프로그래밍 인터뷰에서 적절한 맥락을 가지고 있다고 생각하지 않습니다.
Philip Regan

7
-1 지오메트리는 Just In Time Learning의 좋은 후보이며 우수한 소프트웨어를 만드는 능력에 반영되지 않기 때문에 -1입니다.
Malfist

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을 구합니다.
Tim Goodman

2
기하학이 필요한 직업에는 좋은 질문이라고 생각하기 때문에 +1. 공식에 연결하는 것뿐만 아니라 많은 추론이 필요합니다. 즉 나는 그들이 너무 많이하지 않은 이유만으로 10 년 원에 대해 생각했다으로 난처하게 될 것 좋은 프로그래머를 알고 말했다 - 그러나 질문에 대한 적절한 질문을 요청하지 않는 어떤 개발자 인터뷰. 현재 인기가 높은 SQL 질문 (또한 내가 좋아하는 것)은 최소한 작업별로 다릅니다.
Tim Goodman

3

내가 본 최고의 FizzBuzz 답변은 다음과 같습니다.

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 방언을 작성하길 원할 수 있습니다.

기능적인 스타일로 멋지게 보입니다.
23:57에

2

인터뷰 한 후보에서 몇 가지를 찾습니다. 온라인상에서 설명 할 수없는 이유로, 우리는 아주 가난한 후보들을 얻었고, 그것을 기대하게 되었기 때문에, 나는 그들에 대해 꽤 편합니다. 여전히, 나는 찾습니다 :

  • 디자인 인식.

    "전화 번호가 여러 개인 전화 번호를 가질 수있는 이름과 성을 가진 연락처가있는 주소록 프로그램의 테이블 구조를 보여주십시오 (셀 / 가정 / 직장 등).

    여기서 UML 2.0 사양 다이어그램을 찾지 않고 간단한 버블 다이어그램이 좋습니다. 그것이 합리적이라면

  • 데이터베이스 작업에 대한 지식 (예 : SQL)

    1. 성 "smith"를 가진 사람들의 모든 전화 번호를 얻기 위해 쿼리를 작성
    2. 데이터베이스에있는 모든 고객과 성이 "smith"인 고객의 전화 번호를 얻기위한 쿼리 작성
  • 테스트 지식

    public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)이전에 쿼리 결과를 리턴 하는 서명 이 있는 메소드가 있다고 가정하십시오 . 메소드에 널을 전달하면 NullReferenceException이 발생한다고 가정하십시오. 이 기능을 보여주는 테스트를 작성하십시오.

    GetPhoneNumbers에서 "smith"라는 성의 집 전화 번호 (123)456-7890을 반환한다는 것을 보여주는 테스트를 작성하십시오.

  • 코드를 작성하는 방법에 대한 지식

    작성한 테스트 요구 사항을 충족시키는 방법을 구현하십시오.


지원자의 수와 질을 고려하여, 진지하게 지원 한 모든 사람을 인터뷰했습니다. 나는 아무도 고용하지 않았습니다.


SQL # 2에서는이 모든 것을 하나의 쿼리로 수행하는 것에 대해 이야기하고 있습니까? 왼쪽 / 오른쪽 또는 내부 조인에 대한 이해를 측정하는 것이 목적입니까?
Nicole

@Renesis : 그렇습니다.
Steven Evers

2

나는 일반적으로 그들이 작업 한 마지막 시스템의 블록 다이어그램을 스케치하여 블록 간의 관계에 대해 묻고 작업 / 담당하고있는 블록을 정교하게 만들었습니다. 이 연습을 통해 자신의 작은 영역 너머로 보이는 방법, 그가 무엇을하고 있는지 '알고있는 것'을 아는 ​​것이 얼마나 중요한지, 그리고 그가 한 역할에 대해 배울 수 있습니다. 역할.


2

다음 문제에 대한 알고리즘을 작성하십시오 . 숫자 n이 주어지면 n 개의 노드 가있는 (고유 한) 이진 트리의 총 수를 출력하십시오 .

따라서 n = 0이고 n = 1 인 경우 답은 1입니다. n = 2 인 경우 2 : 루트 노드가 있고 두 번째 노드는 왼쪽 또는 오른쪽입니다.

설계 기술에 대한 통찰력을 얻고 재귀 또는 메모 또는 동적 프로그래밍 솔루션을 생각하는지 확인할 수 있습니다.

[ 이진 검색 트리의 관련이지만 다른 경우에 대해서는이 StackOverflow 토론 을 참조하십시오 .]


동적 프로그래밍을 모르는 UI 프로그래머는 나쁜 프로그래머입니까? 동적 프로그래밍을 기억할 수없는 비즈니스 프로그래머는 나쁘다. topcoder의 많은 십대들이 동적 프로그래밍 문제를 겪을 것이지만 그들이 작성한 코드를 살펴보십시오.
Geek

@Geek : "화이트 보드"문제는 누군가의 사고 과정을 볼 수있는 방법이라는 것을 기억하십시오. 동적 프로그래밍 문제는 무엇보다도 구글에게 인기가 많기 때문에이 토론에 속해야합니다.
Macneil

동의하지 않지만 두 가지 질문이 있습니다. 1. 미지의 해결? 최근 과거의 일부 문제를 해결했거나 여전히 대학 밖에서의 개념을 기억한다면 DP 문제는 공원에서 산책이됩니다. 그것을 잊어 버린 사람은 분명히 화이트 보드에서 잘하지 못할 것입니다. 2. 누군가 문제를 해결하기 위해 고군분투하는 경우 코드 품질을 정량화 할 수있는 방법이 없습니다. 사람이 문제를 해결하고 코드를 작성할 수 있도록 LinkList 또는 문자열 또는 배열과 같은 문제에 대해 문제를 제기하는 것은 어떻습니까?
Geek

나는 인터뷰 대상자가 반드시 그것을 얻을 것으로 기대하지는 않지만 일부 회사는 그렇게 할 것입니다.
Macneil

@Geek :“동적 인 프로그래밍을 모르는 프로그래머는 나쁜 프로그래머입니까?”– . 즉, 동적 프로그래밍에 대한 생각은 익숙하지 않을 때 사소한 것이 아니라는 데 동의합니다. 그러나 그것을 아는 것은 절대적으로 필요합니다.
Konrad Rudolph

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 루프를 통해 수행되면 어떻게됩니까?
Darknight

2
재귀 버전을 구현할 것을 제안합니다. 일반적으로 for-loop 녀석들은 재귀 버전을 성공적으로 구현합니다.
alexb

또는 이것을 단일 진술로 구현할 수 fib(n)=round(power(PHI,n)/SQRT5)있습니다. PHI와 SQRT5는 각각 황금비 (1.618 ...)와 5의 제곱근을 나타내는 상수입니다.
oosterwal

2

데이터베이스의 경우 :

테이블 : 것들

아이디 이름
1 Bodkin Van Horn
후스 푸스 2 개
3 Hoos-Foos
4 핫샷
5 마빈 오그라 블 풍선 얼굴
6 스 니머
7 마빈 오그라 블 풍선 얼굴
8 마빈 오그라 블 풍선 얼굴
9 데이브

이름을 기반으로 이와 같은 테이블을 중복 제거하는 SQL을 작성하십시오 (그리고 어떤 ID를 가져 오는지는 신경 쓰지 않지만 반환되는 ID는 해당 이름에 유효해야 함). 따라서 올바른 SQL이 적용된 테이블은 다음과 같습니다.

테이블 : 것들

아이디 이름
1 Bodkin Van Horn
후스 푸스 2 개
4 핫샷
5 마빈 오그라 블 풍선 얼굴
6 스 니머
9 데이브

난 그게 좋아 왜냐하면:

  • 중복 제거는 실제 문제입니다
  • 그것을 할 수있는 많은 방법이 있습니다
  • 나는 거의 모든 방법이 더 복잡한 SQL (본질적으로 GROUP BY 및 HAVING)을 이해하거나 약간 더 간단한 문장을 연결하여 추론하는 능력을 필요로한다고 생각합니다.
  • 이 마지막 부분으로 인해 구문이나 기타 문제로 어려움을 겪고 있어도 그들이 생각하는 것을 물어보고 그렇게 말할 수 있습니다.
  • 닥터 수스 참조

(이곳 에서이 작업을 수행하는 데 사소한 방법이 있다는 것을 알았으며 수년 동안 너무 복잡했습니다.)


1
"완전히 사소한 것"으로 간주되는 것이 무엇인지 모르겠습니다 SELECT min(ID), Name FROM Things GROUP BY Name.
Tim Goodman

@Tim-모든 것에 대한 카운트를 제공합니다. 나는 중복 된 것을 원합니다. 수동으로 편집 한 결과는 계산에 포함되지 않으며 수백만 행으로 확장되고 있다고 가정합니다. 쉬운 문제이지만 내 경험에 따르면 SQL을 알고 있다고 주장하는 사람들의 80 %가 첫 번째 찌르기까지는 얻을 수 없습니다.
Jon Hopkins

@Jon : "그게 모든 것을 의미합니다"라는 말의 의미가 확실하지 않습니다. 예제 솔루션에서 원하는 것은 각 고유 이름에 대해 하나의 행인 것 같습니다. 귀하의 의견에서 아마도 당신이 같은 것을 의미하는 것처럼 보이지만 HAVING count(Name) > 1샘플 답변이 Bodkin Van Horn, Hot Shot, Snimm 및 Dave를 생략해야한다고 생각합니다.
Tim Goodman

@Tim-당신 말이 맞아요, 정말 불분명합니다. 몇 분 후에 편집하겠습니다.
Jon Hopkins

1
나는 이것을 할 것이라고 생각한다 DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). 선호하는 솔루션이 있습니까?
Tim Goodman

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 카드 덱을 어떻게 표현 하시겠습니까? 모든 프로그래밍 언어는 괜찮습니다. 카드를 어떻게 섞으시겠습니까?


C ++의 셔플 기능이있는 vector <Card> :)
rightfold

1

내가 가장 좋아하는 것은 printf의 프로토 타입을 묻는 것부터 시작하는 것입니다. 그런 다음 한 수준의 문자를 인쇄하는 printf를 구현하는 저수준 API printc (char c)가 주어집니다. 스택이 CPU의 일부인 것처럼 모든 종류의 흥미로운 응답을 제공합니다. 당신이 짐작할 수 있듯이 나는 C와 임베디드 배경에서 왔습니다.


"스택은 CPU의 일부입니다"라는 메시지가 표시되지 않습니다.
barjak

컴퓨터 아키텍처에 대해 아는 사람이라면 누구나 알고있을 것입니다. 나에게 그것은 완전히 관련이 없으므로 그 남자는 그의 무지를 시연하고 있습니다.
Michael K

@aufather : 내가 정확하게 기억한다면, 당신은 varargs()그런 함수 를 호출해야 합니다. 제가 맞습니까? 나는 한 번만 한 일을 한 적이 있습니다.
Michael K

@ barjak-printf 구현을 시작하면 스택에 액세스해야하며 스택이 CPU에 있다는 응답을 얻습니다.
aufather

@Michael-임베디드 세계에서는 플랫폼 아키텍처를 잘 알아야합니다. 그래서이 질문은 무지한 사람들을 아주 빨리 제거합니다.
aufather

1

200 마리의 물고기가 담긴 그릇이 있습니다. 이 물고기 중 99 %는 구피가 아닙니다. 남은 것의 2 %가 구피가되도록 얼마나 많은 물고기를 제거해야합니까? 당신의 일을 보여주십시오.

혼란스러운 요구 사항에 관한 것입니다. 같은 질문에서 관점을 여러 번 바꾸는 방법이라고합니다. 그들은 실제로 무슨 일이 일어나고 있는지 알아낼 수 있는지 확인하기위한 것입니다.

얼마나 많은 사람들이 잘못했는지 놀라게 될 것입니다.


4
그릇에 12 인치 오스카 2 개를 추가하면 곧 구피의 98 %가 제거됩니다.
Geek

구피를 제거하면 어떻게됩니까?

1
1 % 구피, = 200 x 1 % = 2 (200-2 = 198 다른 물고기), 여기서 2 = 2 %, 남은 물고기 = 98 % = 98 (1 : 1). 98 = 198-100 => answer = 100입니다. [다른 물고기를 선택적으로 선택할 수 있다고 가정합니다. 구피를 제거하면 다른 답변이 있습니다.] 좋은 질문입니다. 프로그래머가 아이의 놀이를해야한다고 생각하는 사람은 거의 없습니다.
Orbling

1

몇 가지 즐겨 찾기가 있지만 여기에 거의 항상 나타나는 커플이 있습니다. 대부분의 경우 최종 라운드 기술 (C ++) 인터뷰를 수행하므로 더 길고 더 많은 공개 질문이있어 새로운 관심 분야로 이어집니다. '올바른'대답은 없으며 다른 대화의 시작일뿐입니다.

1) 기본 공유 포인터 구현, tr1 또는 boost의 공유 포인터와 비교하여 결함이있는 위치에 대한 설명, 사용 방법 등

2) 코드 검토. 숙련 된 직원의 경우 설계 문제, 오류, 코딩 공포 및 유지 관리 가능성 문제에 대해 제공된 코드를 자신있게 검토 할 수있을 것으로 기대합니다. 물론 그들이 어떻게 고쳤는지; 때로 그들이 격추하는 하급 개발자에게 그 메시지를 전하는 방법이 있습니다.


1

그것이 나에게 사용 된 이래로 사용해 왔던 한 가지 질문은 다음과 같습니다.

1에서 100 사이의 모든 숫자를 인쇄하는 함수를 작성하십시오.

내가 사용한 이유의 대부분은 솔루션을 가져 와서 다양한 방향으로 이동할 수 있기 때문입니다.

1과 1000, 10000 또는 n 사이의 모든 숫자를 인쇄하도록 함수를 어떻게 수정 하시겠습니까?

이러한 질문에 대한 답변은 성능 요구 사항을 인식 할 수있을뿐만 아니라 변화하는 요구 사항에 어떻게 대응하는지에 대한 통찰력을 제공 할 수 있습니다. 강력한 후보자는 함수 호출 빈도에 필요한 기능과 관련하여 질문에 응답 할 수 있습니다.

다른 방향으로 이동 :

이 함수가 1 분에 여러 번 호출되고 성능이 문제가된다는 것을 알고 있다면 어떻게 변경 하시겠습니까?

나는 이것을 그들의 측면 적 사고를 점검하는 방법으로 사용합니다. 최대 값이 클수록 소수를 계산하는 것이 느릴 수 있으므로 때로는 해결하려는 문제에 따라 조정되는 계산 또는 사전 계산 된 룩업 테이블을 사용하는 것이 더 합리적입니다.


1

다음은 약간의 생각을 불러 일으키는 방법입니다. 간단하고 약간의 수학이 필요하며 기본적인 컴퓨터 디자인 (오버플로, 숫자 표현 등)에 대한 후보자의 지식을 확인합니다.

정수 X, Y 쌍을 입력으로 사용하고 X * Y를 10으로 균등하게 나눌 수 있는지 여부를 결정하는 프로그램 (또는 프로 시저)을 작성하십시오. 중요 참고 : X * Y는 사용 가능한 최대 정수 유형을 오버플로 할 정도로 충분히 클 수 있습니다. 당신의 기계에.


샘플 솔루션 :


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.