Alternatif FizzBuzz Soruları [kapalı]


89

Herkes olmayan tüm iyi FizzBuzz tipi sorunuz FizzBuzz sorunu?

Biriyle röportaj yapıyorum ve FB nispeten iyi tanınıyor ve ezberlemesi o kadar zor değil, bu yüzden fikir arayışındaki ilk durağım yeni bağımlılığım SO.

Yanıtlar:


105

Adayları ayıklamak için kullanılan nispeten basit programlama problemlerinin küçük bir listesini gördüm, tıpkı FizzBuzz gibi. Artan zorluk sırasına göre gördüğüm sorunlardan bazıları şunlardır:

  1. Bir dizeyi ters çevir
  2. Bir cümleyi ters çevirin ("bob köpekleri sever" -> "köpekler bob'u sever")
  3. Bir listede minimum değeri bulun
  4. Bir listedeki maksimum değeri bulun
  5. Kalanı hesaplayın (pay ve payda verildiğinde)
  6. Yinelenenleri içeren bir listeden farklı değerler döndür (ör. "1 3 5 3 7 3 1 1 5" -> "1 3 5 7")
  7. Farklı değerleri ve sayılarını döndürür (ör. Yukarıdaki liste "1 (3) 3 (3) 5 (2) 7 (1)" olur)
  8. Bir ifade dizisi (yalnızca değişkenler, + ve -) ve bir dizi değişken / değer çifti (ör. A = 1, b = 7, c = 3, d = 14) verildiğinde, ifadenin sonucunu ("a + b + c -d "-3 olacaktır).

Bunlar Java içindi ve standart kitaplıkları kullanabilirsiniz, böylece bazıları son derece kolay olabilir (6 gibi). Ama FizzBuzz gibi çalışıyorlar. Programlama hakkında bir fikriniz varsa, en hızlı şekilde yapabilmelisiniz. Dili iyi bilmeseniz bile, en azından bir şeyin nasıl yapılacağının arkasındaki fikri verebilmelisiniz.

Bu testi kullanarak önceki patronlarımdan biri, her şeyi oldukça çabuk bitiren insanlardan, çok çabuk yapabilenlere, yarım saat sonra tek bir tanesine cevap veremeyen bir adama kadar her şeyi gördü.

Ayrıca şunu da belirtmeliyim: Bu görevler verilirken insanların bilgisayarını kullanmalarına izin verdi. Bunlar özellikle onlar o talimatı verilmiştir olabilir Google ve benzerleri kullanılmaktadır.


Madde 8 için, JSR-223 (javax.script) tabanlı bir çözüm kabul edilir mi? :-P (Kuşkusuz bunun kullanımı tamamen abartılı, ancak bazı insanlar bunu java.util.Scanner kullanmak yerine yapmayı tercih ediyor.)
Chris Jester-Young

4
Bu, sorunun özüne dair fikrim dahilinde değil, ancak bunu önerecek kadar bilginiz varsa, o zaman kesinlikle FizzBuzz sorularını geçecek kadar bilginiz var, bu yüzden bunu size karşı tutmam. Hatta sizin lehinize bir artı bile olabilir. Yine de muhtemelen javax.script olmadan nasıl yapacağınızı sorardım.
MBCook

3
Bir süredir cevabını okuyordum ve ne olduğunu anlayamadım, neden beğenmedim, mesele şu ki sorularınızı kodlamak eğlenceli değil :) (bu amaçlandığından sorun değil görüşmeler için). Bu yorumun gerçek bir anlamı yok, sadece onu sistemimden çıkarmak istedim. :) tüm suratlar için özür dilerim
Trufa

1
8 numara için örnek çözümler görmek isterim. İlk 7 çok kolay, ancak 8 (bana göre) diğerlerine göre biraz daha karmaşık görünüyor. Python 3.x'te çalışıyorum ve bu tamamen farklı bir oyun. Muhtemelen farkında olmadığım bir şey.
DonutSteve

31

Belki bu, sorunuzu doğrudan yanıtlamaz, ancak başka bir sorunla karşılaşmanız gerektiğinden emin değilim. "Ezberlemesi kolay" olmasının yanı sıra, FizzBuzz sorusu sadece "kolay" ve asıl mesele bu. Görüştüğünüz kişi, FizzBuzz'ın "tanınmış" olduğu kişiler sınıfındaysa, o zaman FizzBuzz tipi bir sorunun filtrelemeyeceği kişiler sınıfındadır. Bu, onları hemen işe aldığınız anlamına gelmez, ancak bu onların içinden geçip röportajın etine geçebilmeleri gerektiği anlamına gelir.

Başka bir deyişle, Coding Horror'ı okumak için zaman ayıran herkes daha fazla röportaj yapmaya değer. Sadece çözümü hızlı bir şekilde yazmalarını sağlayın, kısaca tartışın (örneğin, Bunu nasıl test edersiniz?) Ve sonra bir sonraki soruya geçin. Ve makalenin dediği gibi, "Kaç adayın en basit programlama görevlerini yerine getirememesi gerçekten şaşırtıcı."


7
Mükemmel cevap. "FizzBuzz kolay ve önemli olan bu ... Coding Horror'ı okumak için zaman ayıran herkes daha fazla röportaj yapmaya değer" QFT. Adaylara sık sık "programlama hakkında nereden okumaya gidiyorsun?" Diye soruyorum. Kaç kişinin tek bir blogdan, web sitesinden veya kitaptan bahsedemeyeceğine hep şaşırıyorum.
Noah Sussman

1
Katılmıyorum. Geçen hafta biriyle röportaj yaptık ve kabul edilen cevabı onlara sorduk. Kelimenin tam anlamıyla "oh, fizzbuzz bekliyordum" dediler ve sonra sorumuza cevap veremediler.
frandroid

23

Euler Projesi'nin ilk dönemlerinden herhangi biri muhtemelen iyi olurdu.

Örneğin:

Sorun 25

Fibonacci dizisi, tekrarlama ilişkisi ile tanımlanır:

Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.

Dolayısıyla ilk 12 dönem şöyle olacaktır:

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. terim, F12, üç basamak içeren ilk terimdir.

1000 basamak içeren Fibonacci dizisindeki ilk terimin dizini nedir?


14

Bir dizgeyi kontrol etmenin palindrom olup olmadığını oldukça basit olduğunu buldum ve iyi bir ot olabilir.


Bunun dile bağlı olduğunu söyleyebilirim. C'de ilginç olabilir, Perl'de bununla yapılır scalar(reverse 'foo') == 'foo'.
jkramer

3
doğru, ama aynı zamanda, daha basit çözümü görebilmek değerlidir ... o zaman "tamam, şimdi ters işlevi yokmuş gibi davran" diyorsun.
Mike Stone

1
C ++ 'da, elle yazılmış bir döngü içermeyen herhangi bir "işlevsel" çözüm için bonus puanlar verirdim. örneğin, "eşittir dönüş (str.begin (), str.end (), str.rbegin ());" veya (hız meraklıları için) "dönüş eşit (str.begin (), str.begin () + str.size () / 2, str.rbegin ());"
Chris Jester-Young

1
Elbette böyle bir cevabı görünce adaya kodun işleyişini de açıklamasını isterim. Sadece yukarıdaki cevabımı kopyalayarak ayağa kalkamazlar! :-P
Chris Jester-Young

10

Modulo operatörünü içermeyen bir FizzBuzz sorusu istedim. Özellikle modulo operatörünün pek sık gelmediği web geliştiricileriyle röportaj yaptığım için. Ve düzenli olarak karşılaştığınız bir şey değilse, ihtiyacınız olan birkaç kez aradığınız şeylerden biridir.

(Kabul edilirse, bu ideal olarak yol boyunca bir matematik dersinde karşılaşmış olmanız gereken bir kavramdır, ancak bu farklı bir konudur.)

Yani, bulduğum şey, hayal ürünü olmadan, Tersine Üçler olarak adlandırdığım şeydi . Talimat:

1 ile 200 arasında 3'ün her bir katını ters sırada yazdıran bir program yazın .

Normal sırayla yapmak kolaydır: 200'ü aşan bir sayıya ulaşana kadar döngü indeksini 3 ile çarpın, sonra çıkın. Sonra kaç tane yinelemenin sonlandırılacağı konusunda endişelenmenize gerek yok, sadece çok yüksek olan ilk değere ulaşana kadar devam edin.

Ama geriye gidersek, nereden başlayacağınızı bilmelisiniz. Bazıları sezgisel olarak 198'in (3 * 66) 3'ün en yüksek katı olduğunu ve bu nedenle 66 kodlu kodun döngüye girdiğini anlayabilir. Diğerleri, bu sayıyı bulmak için matematiksel bir işlem (tamsayı bölümü veya 200 ve 3'ün kayan nokta bölümü üzerinde bir kat ()) kullanabilir ve bunu yaparken daha genel olarak uygulanabilir bir şey sağlayabilir.

Esasen, FizzBuzz ile aynı türden bir problemdir (değerler arasında döngü yapmak ve bunları bir bükülme ile yazdırmak). Bu, modulo işlemi kadar (nispeten) ezoterik bir şey kullanmayan, çözülmesi gereken bir problemdir.


2
Merak ediyorum Legion: Web geliştiricileriniz yeşil sınırlama / alternatif satırlar gibi şeyleri modulosuz nasıl yapıyor?
Andrew Burns

4
CSS3'ün nth-child seçicisini kullanarak sadece alternatif satırlara stil uygulamaya çalışıyorsanız. jQuery, JS aracılığıyla bu tür şeyler yapmak için alternatif seçicilere de sahiptir. Ama daha büyük noktanızla konuşursak, yukarıda da söylediğim gibi, aranan, kullanılan ve sonra çabucak unutulan bir şey çünkü bulması 15 saniye sürdü. Beğendiğimi ya da onayladığımı söylemiyorum ama özellikle giriş seviyesinde oluyor. :)
Lejyon

1
işte benim php çözümüm :) ideone.com/BnJQ3 3 dakika :)
Trufa

Daha düşük seviyeli dillerde daha zor olmalı, çünkü Ruby'de sayıları (sırayla) bir diziye itmek ve ardından tüm diziyi tersine çevirmek kadar kolaydır. ideone.com/MKKb6
Kerrick

Python:print [x for x in xrange(3, 200, 3)][::-1]
beatgammit

9

10 saniyede yapılabilecek, ancak kelimenin tam anlamıyla hiçbir şeyi programlayamayanları ortadan kaldıracak gerçekten süper basit bir şey için şunu deneyin:

Sor: bana göster (kağıt üzerinde ama beyaz tahta üzerinde daha iyi) iki değişkenin değerlerini nasıl değiştireceğinizi.

Bu benim fikrim değildi, ama orijinal FizzBuzz sorusuyla ilgili bir blog gönderisinde Jacob adlı biri tarafından bir yorumda yayınlandı .

Jacob şöyle devam ediyor:

Eğer yapmazlarsa başlangıç üçüncü değişkeni oluşturma ile, hemen hemen yazma o kişi kapalı olabilir. Sadece bu soruyla (kuşkusuz bu noktada taranmamış) başvuru sahiplerinin üçte birini yarıya indirebileceğimi öğrendim.

Orijinal blog gönderisinde, üçüncü bir değişken gerektirmeden (ekleme / çıkarma, xor vb.) Ve tabii ki, bunu destekleyen bir dil kullanıyorsanız, bu değişken değişimini gerçekleştirmenin yolları hakkında başka ilginç bir tartışma var. tek bir ifadede / işlemde o kadar iyi bir test olmayabilir.

Benim fikrim olmasa da, en basit programları bile yazan biri tarafından yaklaşık 10 saniye içinde cevaplanabilecek (ve cevaplanması gereken) çok zarif, basit, kolay bir soru olduğu için bunu buraya göndermek istedim. Aynı zamanda, modülo operatörü gibi, oldukça iyi programcı olan pek çok insanın aşina olmadığı (kendi deneyimlerimden bildiğim), görünüşte belirsiz operatörlerin kullanılmasını da gerektirmez.


1
Bunun çok iyi bir fikir olduğunu düşünüyorum. Bir aday, neden for yerine foreach'i kullandıklarını ve nasıl düzelteceklerini merak ederek bir programda acı verici bir şekilde hata ayıklarken, 20 dakika boyunca oturup izlemekten kesinlikle daha iyidir! (Az önce yaptığım gibi)
Mike Nelson

std :: takas (a, b); Neden gerektiğini ben sadece her standart kütüphane hakkında hiç Benim için yapar mutlu zaman üçüncü bir değişken oluşturmak?

@Dan - Fikir Bunu istenir olmasıdır olmadan herhangi kütüphaneleri kullanılarak ve sadece kullanılarak yerleşik seçtiğiniz dilde anahtar kelimeler. Elbette, gerçek dünyada bunu başarmak için bir kütüphane rutini kullanabilirsiniz, tıpkı kendi yazınızı yazmak yerine (örneğin) bir bağlantılı liste yapısı için bir kütüphane rutini kullanmakla aynı. Bu testin amacı, herhangi bir adayın bunu başarmak için bir kütüphaneye başvurmaya gerek kalmadan yapabilmesini beklemenin yeterince basit ve söz konusu olmadığıdır.
CraigTP

Peki Jacob görüşülen kişiye üçüncü bir değişken kullanmasını mı öneriyor yoksa hayır mı? Geliştiriciden üçüncü bir değişken kullanmamasını istediği bu soruya alternatifler gördüm. Cevabını ifade etme şekli oldukça belirsiz.
theGreenCabbage

1
Kendini sadece "iyi" bir programcı sanan biri olarak bu beni korkuttu. Aklıma ilk gelen düşüncem, "Sevgili Tanrım, bir 3. değişken kullanacağım ama kesinlikle bunu yapmadan zekice bir yol istiyor!"
Devil's Advocate

8

Fibonacci, bir dizgeyi ters çevirmek, bir baytta ayarlanan bit sayısını saymak diğer yaygın olanlardır. Project Euler ayrıca büyük bir artan zorluk koleksiyonuna sahiptir.


Fibonaaci, biraz daha gelişmiş olsa da güzel bir şey, tamamen acemiyim ve 20-25 dakika sürdü, bu yüzden referansınız var :)
Trufa

Fibonacci, FizzBuzz ile vuruldum ve bir dizideki yinelenen tam sayıları kaldırdım - hepsi bugün bir röportajda (4 saat)
IAbstract

4

Belirli bir sayının faktörlerini döndürmek için bir uygulama yazmalarını isteyin. Kısa sürede yapmak kolay ve başarılı olmak zordur. Kısa bir süre içinde onların tarzlarını ve problemler üzerinden nasıl düşündüklerini görebilirsiniz.


2

Y dizesi içinde X dizesinin ilk oluşumunun dizinini döndürür

Strstr () 'yi uygulamak, akıllı optimizasyon için fırsat sağlarken dilin temel bir anlayışını gerektirir.


2

Bir C / C ++ röportajıysa, kişinin işaretçileri bildiğinden emin olun.

Genel - basit algoritma ([tek / çift] bağlantılı liste). Her durumda eklemenin karmaşıklığını sorun (başlangıçta, sonunda optimizasyonlar ...)?

(Genel) Yalnızca 3 * N / 2 karşılaştırmayla bir diziden (N boyutunda) min ve max'ı nasıl bulursunuz?

C / C ++: Birden çok "strcat" i bir arabelleğe nasıl optimize edersiniz?


Bana öyle geliyor ki, "Sadece 3 * N / 2 karşılaştırmalı bir diziden (N boyutunda) min ve max'ı nasıl bulursunuz?" 3 * N / 2 sayısının dizi öğelerinin bir dizi karşılaştırması olduğunu açıklığa kavuşturmak iyidir, ancak örneğin int'i serbestçe karşılaştırabilirsiniz. örneğin döngülerde (i <dizi boyutu).
sergtk


0

Nasıl olur: Birden çok değeri saklamak için tek bir tam sayı kullanmak istiyorum. Bunun nasıl işe yarayacağını açıklayın.

Bit maskeleri ve işlemleri hakkında bir fikirleri yoksa, muhtemelen diğer sorunları çözemezler.


9
Biraz maskeleri açıkladıktan veya işaret ettikten sonra, kişi alnına vurmazsa ve kendisiyle alay ederek başını sallamazsa daha öğretici olduğunu söyleyebilirim. Bit maskeleri, C, gömülü aygıtlar veya ağ yapmadıkça yaygın bir deyim değildir. Pek çok yetenekli insan yok.
Gregg Lind

2
Hmm, o zaman 1,2 ve 3'ü ondalık 123'te saklamanın doğru bir cevap olarak kabul edilip edilmeyeceğine karar vermelisiniz, matematik sadece 3 değişken bildirmeye kıyasla çirkin karmaşık olsa bile. Veya 1,2,3'ü x = 1 yazarak saklamak; x = 2; x = 3; Demek istediğim, bu değerleri aynı anda saklamamız gerekiyor mu?
MatthewMartin

0

Asal sayıların bir listesini bulmak oldukça yaygın bir sorudur, ancak yine de biraz düşünmeyi gerektirir ve insanların verebileceği çeşitli cevaplar vardır.

Ayrıca, Harita / Sözlük tipi bir veri yapısını uygulamak için kaç kişinin zorlandığına da şaşıracaksınız.


0

Adaylarımdan , seçtikleri herhangi bir sözde dilde belirli bir sayının faktöriyelini hesaplamak için bir program oluşturmalarını istedim . Çözülmesi oldukça kolay bir sorundur ve özyineleme ile ilgili doğal takip sorularına (bu sıklıkla sorulabilir) iyi bir katkı sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.