Kolay mülakat zor soru var: 1..100, eksik numaraları bulmak verilen numaraları
İlginç bir iş görüşmesi deneyimi bir süre önce vardı. Bu soru gerçekten çok kolay:
Q1Bir torba numaraları
1
,2
,3
, ...,100
. içeren var Her sayı tam olarak bir kez görünür, 100 sayı vardır. Şimdi rastgele bir çanta seçti. Eksik numarasını bulun.
Bu görüşmeden önce, tabii ki soru duydum, ben çok çabuk hatları boyunca cevap verdi:
A1: Sayılar
1 2 3 … N
toplamı(N 1)(N/2)
(Wikipedia: sum of arithmetic series).N = 100
, miktar5050
.Eğer tüm numaraları çanta varsa Böylece, toplamı tam olarak
5050
olacak. Bir sayı eksik olduğu için, bu miktar daha az olacak ve fark sayıdır.O(N)
O(1)
uzayda kayıp parça buluruz.
Bu noktada iyi bir şey yaptığımı sanıyordum, ama aniden soru beklenmedik bir hal aldı:
S2: Doğru, ama şimdi bunu nasıl olursa yaparsınİKİnumara eksik?
Asla/Ben de panikledim/önce bu değişimi kabul duydum, gördüm ve bu soruya cevap veremedi. Görüşmeci ısrar bilmek benim düşünce süreci, yani bahsettiğim belki alabiliriz daha fazla bilgi ile karşılaştırarak karşı beklenen ürün, ya da belki de ne bir saniye geçtikten sonra toplanmış olan bazı bilgiler ilk pas, vb, ama gerçekten sadece çekim karanlık yerine aslında sahip net bir yol çözümü.
Görüşmeci ikinci bir denklem olması gerçekten sorunu çözmek için bir yol olduğunu söyleyerek beni teşvik etmek için elinden geleni yaptı. Bu noktada ben biraz üzgün (bilmeden cevap önce el), ve istenirse bu bir genel (okuma: "yararlı") programlama tekniği, ya da eğer sadece bir hile/yakaladım cevap.
Görüşmeci cevabı beni şaşırttı: tekniği 3 eksik numaraları bulmak için genelleme yapabilirsiniz. Aslında, onu bulmak için genelleme yapabilirsinizkeksik sayılar.
QkKesinlikleknumaraları çantasından eksik, nasıl verimli bulmak istiyorsunuz?
Bu birkaç ay önce oldu, ve ben hala bu tekniğin ne olduğunu anlayamadı. Belli ki Ω(N)
Bir kez tüm sayıları en az bir kez tarama etmeliyiz beri alt sınır var, ama görüşmeci için ısrar ettiZAMANveBOŞLUKçözme tekniği (O(N)
zaman giriş eksi tarama) karmaşıklığı tanımlanırkdeğilN.
Yani burada soru basit:
- Nasıl çözersinS2?
- Nasıl çözersinQ3?
- Nasıl çözersinQk?
Açıklamalar
- Genellikle vardırN1. sayılarNsadece 1..100.
- Bakmıyorum belirgin kümesi tabanlı bir çözüm, örneğin kullanarak bir bit set kodlama varlığı/yokluğu her sayı değeri belirlenmiş bit, bu nedenle kullanarak
O(N)
bit ek alan. Herhangi bir ek alan ile orantılı göze alamayızN. - Ayrıca sıralama-ilk belirgin yaklaşım aramıyorum. Bu ve küme tabanlı bir yaklaşım, bir röportajda (uygulamak kolay değildir ve bağlı olarak . gerçekten övgüye değer ^em>Nolabilir , çok pratik. Kutsal Kase çözüm olabilir ya da uygulamak için pratik olmayabilir, ama yine de istenen asimptotik özelliklere sahip olan) arıyorum.
Yani yine, tabii ki sana O(N)
, ama sadece küçük bilgi miktarı çekebilirsiniz (açısından tanımlanmış . giriş tarama gerekir ^em>kdeğilNve sonra bulmak gerekirkeksik sayılar bir şekilde.
CEVAP
İşte Dimitris Andreou's link bir özet.
Ben-inci güçlerin toplamı unutma, i=1,2,..,k) nerede. Bu denklem sistemini çözmek için sorun azaltır
bir
bir
...
bir
Kullanarak 18**, b bilerek
c
c
...
c
Eğer polinom genişletin (x-a
Bu hatırlama güçlerini numaralarını kurtarmak için yeterli bir kanıt biter. Sabit k için, bu iyi bir yaklaşım.
K değişen, ancak bilgisayar doğrudan yaklaşım c
Yüksek seviye sabit k yarı:
- Ben-inci sayıların güçlerini hesaplamak
- I-th bilinmeyen numaralar güçleri toplamı almak için çıkarın. Toplamları b Ara
ben. - Newton kimlikleri b katsayıları hesaplamak için kullanın
ben; onları Ara c ben. Temelde, c 1= b 1; c 2(c . = ^alt>1b 1- b 2)/2; kesin formüller için lazımdır - Faktör polinom xk-c
1xk-1... c k. - Polinom kökleri gereken bir sayı
1, ..., k.
K değişken için, n n <=&; 2n Miller-Rabin örneğin kullanarak, ve bütün numaraları adımları gerçekleştirin q lt azaltılmış mod q.
Heinrich Apfelmus açıklamalı olarak kullanabileceğiniz bir başbakan yerine q=2 q⌈günlük n⌉ve arithmetic in finite field gerçekleştirin.
Belirli bir miktar ulaşmak için numara...
Her şeyi kaldırmak için PHP kodu ama n...
toplam Python numaraları listesi...
Kolay denetleyicisi için verilen Emre ...
AngularJS biçiminde telefon ve kredi k...