Cevabı Vermek
Aday soru soracak kadar ilgilenmezse, nefesimi boşa harcamazdım ama @Yannis_Rizos cevabının çok daha iyi olduğunu söyleyecektim .
Röportajlar oldukça hızlı. Bir röportajdan sonraki günler boyunca sık sık aradığımı biliyorum.
FizzBuzz Classic'i Kodlayamayan Kişiler
Büyük bir yapışma noktasının% operatörünün farkında olduğunu hayal ediyorum. Birinin karşılaştırmayı düşünebileceğini umuyorsunuz (myInt / 3) == (myDouble / 3.0)
ama belki de bir röportajın stresiyle ... FizzBuzz Classic, kaba bir yaklaşımı zorlar ve çözmesi en kolay algoritma sorunları kategorisine sokar. Bir ipucu olarak, insanlardan sadece "Fizz" i yarı krediye kodlamalarını ve daha sonra bir geliştirme olarak "Buzz" ı eklemelerini istediniz mi?
Bence sorunuzun nihai cevabı iyi adaylar bulmak gerçekten zor.
Genel Mülakat Soruları
Sıklıkla adaylardan heyecan duydukları son programlama projesini açıklamalarını istemek daha kolay ve daha verimli buldum. Bu soru ile% 100 başarı elde ettim, yani bir programlama projesi hakkında animasyonla konuşan ve bununla ilgili teknik soruları cevaplayabilen insanlar büyük işe alımlardı ve yapamayanlar değildi. Bu, adayı rahatlatmanın ve açık uçlu tartışmayı teşvik etmenin güzel yan etkilerine sahiptir. Bu soru ile aday aslında size en uygun olanı söyleyecektir.
Belki bir think tank algoritması soruları da gereklidir, ama ben onları "favori proje" sorusu lehine terk ettim.
FizzBuzz toplamı (Oğlu)
Röportaj sorunuz FizzBuzz ile eşdeğer değil:
10'un altında 3 veya 5'in katları olan tüm doğal sayıları listelersek, 3, 5, 6 ve 9'u alırız. Bu katların toplamı 23'tür. 3 veya 5'in katlarının toplamını bulan bir işlev yazın. 1000'in altında.
FizzBuzz Classic sizi n yinelemelere (her sayıyı veya Fizz / Buzz'ı yazdırmak için) gitmeye zorladığında , sorununuz n / 5 + n / 3 + n / 15 yinelemelerinde veya hatta hiçbir yinelemede yapılabilir - doğrudan sabit- nokta hesaplaması mümkündür. Aşağıdaki program bu üç yöntemi karşılaştırır:
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;
}
Çıktı (FizzBuzz <1000 toplamı):
$JDK_HOME/bin/java FizzBuzzNot 999
Brute force sum: 233168 time: 0
Only multiples sum: 233168 time: 0
Sum of series: 233168 time: 0
Performans karşılaştırması için daha büyük bir n ile:
$JDK_HOME/bin/java FizzBuzzNot 1000000000
Brute force sum: 233333334166666668 time: 4744
Only multiples sum: 233333334166666668 time: 818
Sum of series: 233333334166666668 time: 0
Bunu konu dışı olarak oy kullananlara not
Bu soruya bir çözüm sunmanın amacı, FizzBuzz Sum'a kaba kuvvet çözümünün FizzBuzz Classic'e benzemekle birlikte, Sum problemine daha iyi çözümlerin mevcut olduğunu ve bu da onu temelde farklı bir problem haline getirdiğini göstermektir. Bir dizinin toplamı için uygun formülü hatırlamıyorsanız veya 3 veya 5 adım attığında geçerli olduğunu bilmiyorsanız, FizzBuzz'ın toplamı son derece zordur.
Diziyi ikiye bölerek, yarısını tersine çevirip eşleştirerek bir dizinin toplamı için formülü yeniden türetirseniz, sizi gerçekten dağınık bir yola indirebilecek (n + 1) (n / 2) elde edersiniz tamsayı bölümü ve kesik kalanlar söz konusu olduğunda. Bu formülün (n (a1 + an)) / 2 sürümü, n'nin tüm değerleri için basit bir cevap için kesinlikle önemlidir.