대답하기
후보자가 물어볼만큼 관심이 없다면 숨을 쉬지 않지만 @Yannis_Rizos 답변 이 훨씬 좋습니다.
인터뷰는 매우 빠릅니다. 인터뷰 후 며칠 동안 자주 물건을 찾는다는 것을 알고 있습니다.
FizzBuzz Classic을 코딩 할 수없는 사람들
큰 문제가 % 연산자를 인식하고 있다고 생각합니다. (myInt / 3) == (myDouble / 3.0)
FizzBuzz Classic은 누군가가 인터뷰의 스트레스와 비교할 수는 있지만 어쩌면 가장 쉬운 알고리즘 문제의 범주에 놓이는 무차별 대입 방식을 강요 할 수 있기를 바랍니다 . 힌트로, 사람들에게 "Fizz"를 반 신용으로 코딩하고 나중에 "Buzz"를 강화로 추가하도록 요청 했습니까?
귀하의 질문에 대한 궁극적 인 답변은 좋은 후보자를 찾기가 정말 어렵다는 것입니다.
면접 질문
후보자들에게 그들이 마지막으로 기대했던 마지막 프로그래밍 프로젝트를 설명하도록 요청하는 것이 더 쉽고 생산적인 경우가 많았습니다. 나는이 질문에 100 % 성공했습니다. 즉, 프로그래밍 프로젝트에 대해 애니메이션으로 이야기하고 그것에 관한 기술적 질문에 대답 할 수있는 사람들은 훌륭한 고용인이었고 그렇지 않은 사람들은 그렇지 않았습니다. 이것은 후보를 편하게하고 공개 토론을 장려하는 좋은 부작용이 있습니다. 이 질문으로 응시자는 사실상 그들이 가장 적합한 것을 알려줄 것입니다.
아마도 싱크 탱크 알고리즘에 관한 질문도 필요할지 모르지만 "즐겨 찾기 프로젝트"질문에 찬성하여 포기했습니다.
FizzBuzz의 합 (아들)
인터뷰 질문은 FizzBuzz와 동일하지 않습니다.
10 이하의 3 또는 5의 배수 인 모든 자연수를 나열하면 3, 5, 6 및 9가됩니다.이 배수의 합은 23입니다. 3 또는 5의 모든 배수의 합을 구하는 함수를 작성하십시오. 1000 이하
FizzBuzz Classic에서 n 개의 반복 (모든 숫자 또는 Fizz / Buzz를 인쇄하기 위해)을 수행해야하는 경우, n / 5 + n / 3 + n / 15 반복 또는 심지어 반복없이 직접 문제를 해결할 수 있습니다. 포인트 계산이 가능합니다. 다음 프로그램은이 세 가지 방법을 비교합니다.
public static void main(String[] args) {
long n = Long.valueOf(args[0]).longValue();
long sum = 0;
long ms = System.currentTimeMillis();
// Brute force method Performance: cn
for (long i = 1; i <= n; i++) {
if ((i % 3) == 0) { sum += i;
} else if ((i % 5) == 0) { sum += i; }
}
System.out.print("Brute force sum: " + sum);
System.out.println(" time: " + (System.currentTimeMillis() - ms));
ms = System.currentTimeMillis();
// Second solution: iterate through only numbers we are
// interested in. Performance: c * (n/3 + n/5 + n/15)
// We counted multiples of 15 twice, so subtract one of them
sum = countSum(n, 3) + countSum(n, 5) - countSum(n, 15);
System.out.print("Only multiples sum: " + sum);
System.out.println(" time: " + (System.currentTimeMillis() - ms));
ms = System.currentTimeMillis();
// Third solution: Use high school algebra. Performance: c
sum = sumSeries(n, 3) + sumSeries(n, 5) - sumSeries(n, 15);
System.out.print("Sum of series: " + sum);
System.out.println(" time: " + (System.currentTimeMillis() - ms));
}
// Iteravely sum all multiples of skip
private static long countSum(long n, long skip) {
long skipTotal = skip;
long grandTotal = 0;
while (skipTotal <= n) {
grandTotal += skipTotal; skipTotal += skip;
}
return grandTotal;
}
// Thanks to @Caleb for pointing this out! High school algebra
// tells us that the sum of a series is: (n * (a1 + an)) / 2
// where a1 is the first term and an is the nth term. E.g. The
// sum of a series of 3 is: (n/3 * (3 + n - (n % 3))) / 2
// Since we are thinking about performance here, we'll shift
// right one instead of dividing by 2 for style points. ;-D
private static long sumSeries(long n, long skip) {
return (n/skip * (skip + n - (n % skip))) >> 1;
}
출력 (FizzBuzz의 합 <1000) :
$JDK_HOME/bin/java FizzBuzzNot 999
Brute force sum: 233168 time: 0
Only multiples sum: 233168 time: 0
Sum of series: 233168 time: 0
성능 비교를 위해 n이 더 큰 경우 :
$JDK_HOME/bin/java FizzBuzzNot 1000000000
Brute force sum: 233333334166666668 time: 4744
Only multiples sum: 233333334166666668 time: 818
Sum of series: 233333334166666668 time: 0
이 주제를 주 제외로 다운 투표 한 사람들에게
이 질문에 대한 해결책을 제시하는 요점은 Sum of FizzBuzz에 대한 무차별 대입 솔루션은 FizzBuzz Classic과 유사하지만 Sum 문제에 대한 더 나은 솔루션을 사용할 수 있으며 근본적으로 다른 문제가된다는 것입니다. FizzBuzz의 합은 시리즈의 합에 대한 적절한 공식을 기억하지 않거나 3 또는 5 씩 밟을 때 적용된다는 것을 모르는 경우 매우 까다 롭습니다.
시리즈를 반으로 나누고 반을 뒤집고 쌍을 이루면 시리즈의 합에 대한 공식을 다시 도출하면 (n + 1) (n / 2)가되어 정말 지저분한 길을 밟을 수 있습니다 정수 나누기와 잘린 나머지 부분에 관한 한. 이 공식의 (n (a1 + an)) / 2 버전은 n의 모든 값에 대한 간단한 대답에 절대적으로 중요합니다.