아무도없는 좋은의 FizzBuzz 타입 질문이 FizzBuzz 문제?
나는 누군가를 인터뷰하고 있는데 FB는 상대적으로 잘 알려져 있고 암기하기 어렵지 않기 때문에 아이디어를 찾는 첫 번째 중지는 나의 새로운 중독 SO입니다.
답변:
저는 FizzBuzz처럼 후보자를 제거하는 데 사용되는 비교적 간단한 프로그래밍 문제의 작은 목록을 보았습니다. 난이도가 증가하는 순서대로 내가 본 몇 가지 문제는 다음과 같습니다.
이것들은 Java 용이었고 표준 라이브러리를 사용할 수 있으므로 그중 일부는 매우 쉬울 수 있습니다 (예 : 6). 그러나 그들은 FizzBuzz처럼 작동합니다. 프로그래밍에 대한 단서가 있다면 가장 빨리 할 수있을 것입니다. 언어를 잘 모르더라도 적어도 무언가를하는 방법에 대한 아이디어를 제공 할 수 있어야합니다.
이 테스트를 사용하여 이전 상사 중 한 명이 모든 것을 빠르게 처리 한 사람부터 가장 빠르게 할 수있는 사람, 30 분 후에 한 사람에게 대답 할 수없는 사람까지 모든 것을 보았습니다.
나는 또한 주목해야한다 : 그는 사람들이 이러한 작업을받는 동안 자신의 컴퓨터를 사용하도록했다. 그들은 Google 등을 사용할 수 있다고 특별히 지시 받았습니다 .
아마도 이것은 귀하의 질문에 직접적으로 대답하지 않지만 다른 문제를 생각 해낼 필요가 있는지 확실하지 않습니다. "기억하기 쉬운"것 외에도 FizzBuzz 질문은 "쉬운"단순한 질문입니다. 그게 요점입니다. 인터뷰하는 사람이 FizzBuzz가 "잘 알려진"사람들의 클래스에 속한다면, 그들은 FizzBuzz 유형의 질문이 걸러 내지 않을 사람들의 클래스에 속합니다. 그것은 당신이 그 자리에서 그들을 고용한다는 것을 의미하지는 않지만 그들이 그것을 통해 바람을 피우고 인터뷰의 핵심에 도달 할 수 있어야 함을 의미합니다.
다시 말해, Coding Horror 를 읽는 데 시간을 할애하는 사람은 더 많은 인터뷰를 할 가치가 있습니다. 해결책을 빨리 작성하고 간략하게 토론 (예 : 어떻게 테스트합니까?) 한 다음 다음 질문으로 넘어가도록합니다. 그리고 기사에서 말하는 것처럼 "가장 간단한 프로그래밍 작업을 수행 할 수없는 후보자가 얼마나 많은지 정말 놀랍습니다."
Project Euler 의 초기 버전 은 아마도 좋을 것입니다.
예를 들면 :
문제 25
피보나치 수열은 반복 관계로 정의됩니다.
Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.
따라서 처음 12 개 용어는 다음과 같습니다.
F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144
12 번째 항인 F12는 3 자리 숫자를 포함하는 첫 번째 항입니다.
1000 자리를 포함하는 피보나치 수열의 첫 번째 항의 색인은 무엇입니까?
나는 그것이 회문인지 확인하는 것이 괜찮은 제초기가 될 수있는 매우 간단한 것임을 발견했다.
scalar(reverse 'foo') == 'foo'
.
모듈로 연산자를 포함하지 않는 FizzBuzz 질문을 원했습니다. 특히 나는 일반적으로 모듈로 연산자가 그렇게 자주 나오지 않는 웹 개발자를 인터뷰하기 때문에. 그리고 그것이 당신이 정기적으로 마주 치는 것이 아니라면, 당신이 그것을 필요로하는 몇 번 찾게되는 것들 중 하나입니다.
(그렇다면 이상적으로는 어딘가에서 수학 과정에서 접 했어야하는 개념이지만 다른 주제입니다.)
그래서 제가 생각해 낸 것은 제가 상상할 수없이 Threes in Reverse 라고 부르는 것 입니다. 지침은 다음과 같습니다.
1에서 200 사이의 3의 배수마다 역순으로 인쇄하는 프로그램을 작성하십시오 .
일반적인 순서로 쉽게 수행 할 수 있습니다. 200을 초과하는 숫자에 도달 할 때까지 루프 인덱스에 3을 곱한 다음 종료하십시오. 종료 할 반복 횟수에 대해 걱정할 필요가 없습니다. 너무 높은 첫 번째 값에 도달 할 때까지 계속 진행하면됩니다.
하지만 거꾸로 돌아 가면 어디서부터 시작해야하는지 알아야합니다. 어떤 사람들은 198 (3 * 66)이 3의 가장 높은 배수라는 것을 직관적으로 깨닫고 66을 루프에 하드 코딩합니다. 다른 사람들은 수학적 연산 (정수 나누기 또는 부동 소수점 나누기 200과 3에 대한 floor ())을 사용하여 그 숫자를 알아 내고 그렇게함으로써 좀 더 일반적으로 적용 가능한 것을 제공 할 수 있습니다.
본질적으로 FizzBuzz와 같은 종류의 문제입니다 (값을 반복하고 비틀어 출력). 이것은 모듈로 작업만큼 (상대적으로) 난해한 것을 사용하지 않는 해결해야 할 문제입니다.
print [x for x in xrange(3, 200, 3)][::-1]
10 초 만에 완료 할 수있는 매우 간단한 작업을 수행하지만 문자 그대로 아무것도 프로그래밍 할 수없는 사람들을 제거하려면 다음을 시도하십시오.
질문 : 두 변수의 값을 바꾸는 방법을 보여주세요 (종이에는 있지만 화이트 보드에는 더 좋습니다).
이것은 내 생각이 아니었지만 원래 FizzBuzz 질문에 대한 모든 블로그 게시물 에 Jacob이라는 사람 의 댓글 에 게시되었습니다 .
Jacob은 계속해서 말합니다.
그들이 세 번째 변수를 만드는 것으로 시작 하지 않는다면 , 그 사람을 거의 쓸어 버릴 수 있습니다. 나는 그 질문만으로도 지원자들의 1/3에서 절반을 줄일 수 있다는 것을 발견했습니다.
세 번째 변수 (더하기 / 빼기, xor 등)없이이 변수 스와핑을 수행하는 방법에 대한 원래 블로그 게시물에 대한 추가 흥미로운 토론이 있습니다. 물론이를 지원하는 언어를 사용하는 경우 단일 명령문 / 연산에서는 그렇게 좋은 테스트가 아닐 수 있습니다.
제 생각은 아니지만, 아주 단순한 프로그램을 작성한 사람이 약 10 초 이내에 답변 할 수있는 (그리고 그래야하는) 우아하고 간단하고 쉬운 질문이기 때문에 여기에 게시하고 싶었습니다. 또한 모듈로 연산자와 같이 다소 모호한 연산자를 사용할 필요가 없습니다. 그렇지 않으면 상당히 괜찮은 프로그래머 인 많은 사람들이 단순히 익숙하지 않습니다 (내 경험으로 알고 있음).
주어진 숫자의 인수를 반환하는 앱을 작성하도록 요청하십시오. 단기간에 잘하기는 쉽지만 잘하기는 어렵습니다. 그들의 스타일과 그들이 문제를 해결하는 방식을 짧은 시간 안에 볼 수 있습니다.
C / C ++ 인터뷰라면 그 사람이 포인터에 대해 알고 있는지 확인하십시오.
일반-단순 알고리즘 ([단일 / 이중] 연결 목록). 각 경우에 추가의 복잡성에 대해 질문하십시오 (시작, 끝, 최적화 ...)?
(일반) 3 * N / 2 비교만으로 배열 (N 크기)에서 최소값과 최대 값을 어떻게 찾습니까?
C / C ++ : 여러 "strcat"을 버퍼에 어떻게 최적화 하시겠습니까?
C ++ FAQ Lite에서 6.14를 확인하십시오.
방법 : 단일 정수를 사용하여 여러 값을 저장하고 싶습니다. 그것이 어떻게 작동하는지 설명하십시오.
비트 마스크와 작업에 대한 단서가 없다면 다른 문제를 해결할 수 없을 것입니다.