Yazar | Joey Colon
Çevirmen | Crescent Moon, Baş Editör | Tu Min
Baş resmi | Visual China'dan CSDN indirmesi
Üretildi | CSDN (ID: CSDNnews)
Aşağıdaki çeviridir:
Halk Facebook için karışık övgü ve eleştirilere rağmen, açık kaynak topluluğuna yaptıkları katkılar birçok geliştiriciye gerçekten fayda sağladı. Bu makalede, bir Facebook front-end mühendis pozisyonu için mülakat yaparken karşılaşabileceğiniz mülakat sorularını tanıtmama izin verin.
Sorun bildirimi
Reimplement Array.flat: Spesifik işlev, herhangi bir sayıda iç içe eleman içerebilen bir girdi dizisini kabul etmek ve girdi dizisini düzleştiren yeni bir dizi döndürmektir. Bu soruda, "düzleştirilmiş" dizi, temel türdeki tüm öğeleri içeren bir diziyi ifade eder.
Misal
giriş:
Çıktı:
Sorunu anlayın
Problem tanımı çok açık görünüyor, yani girdi dizisinin değerleriyle yeni bir dizi yaratmak, ancak yeni dizi iç içe diziler içermiyor.
Bu aşamada, öncelikle görüşmeci ile sorun hakkındaki varsayımlarımı netleştireceğim. Girdinin bir dizi olmasının garantili olup olmadığını bilmem gerekiyor (geçersiz girdi veya boş girdi yok). Görüşmeci, bu varsayımı yapamayacağımızı söyledi.
Başka bir soru şudur: Değerin bir tam sayı olması gerektiğini varsayabilir miyiz? Bu sorunun uygulamanın ayrıntılarını değiştirmesi olası olmasa da, herhangi bir varsayımda bulunmadan önce daima açıklığa kavuşturun. Dizide yuvalanmış tek temel türlerin tamsayılar olduğunu varsayıyoruz.
Bazı detayları açıkladıktan sonra, kendi girdi örneklerimi ve buna karşılık gelen çıktıları beyaz tahtaya verdim.
Bir örnek çizerken, yazdıklarınıza ve sorunu manuel olarak nasıl çözdüğünüze son derece dikkat etmeniz gerekir. Basit örneklerle başlamayı, ardından sınır koşullarını düşünmeyi ve yavaş yavaş karmaşık problemlere dalmayı seviyorum.
Eşleştirme sorunu
Yalnızca ilk örneğe bakarsak, açıkça görülüyor ki tüm diziyi taramamız, her öğenin bir tamsayı değeri olup olmadığını kontrol etmemiz ve sonra değerini çıktı dizisine yazmamız gerekir. Tutmayan tek koşul, o anda kontrol edilen elemanın bir dizi olmasıdır. Geçerli öğe bir dizi ise, sonraki dizi olmayan öğe bulunmalı ve çıktı dizisine yazılmalıdır. Bu problem özyineleme ile çözülmeye çok uygun görünüyor.
Ancak yineleme gerektiren herhangi bir sorunun gizli bir sınırlamayla karşılaşacağı unutulmamalıdır: çağrı yığınının derinlik sınırı. Bunu görüşmeci için netleştirdiğinizden emin olun. Görüşmeci bana bu konuda endişelenmeme gerek olmadığını söyledi, bu iyi, hadi devam edelim.
Çözümü planlayın
Çözümler hakkında düşünmek beceri gerektirir. Problemleri özyinelemeli bir şekilde düşünürken kendimize bir soru sormalıyız: Şu anda girdi çağrı yığınının durumu göz önüne alındığında, hangi görevi yerine getirmeliyiz?
Özyineleme ile başa çıkmak için "sürücü fonksiyonu" tekniğini kullanmanın çok kolay olduğunu düşünüyorum. Bu tekniği kullanmak için, bir "kabuk" fonksiyonu oluşturmamız ve özyinelemeli fonksiyonun kullanacağı başlangıç değerini ayarlamamız gerekir. Örneğin, aşağıdaki örnek:
İlk olarak, yardımcı fonksiyonda tamamlanacak işi yazın, fonksiyon çalıştırıldıktan sonra newArr gerekli değere sahiptir.
Şimdi bu yardımcı işlevi düşünün. Daha önce de belirtildiği gibi, dizinin tamamını taramamız gerekir.Eğer mevcut öğe bir dizi değilse, onu doğrudan yeni diziye koyun; aksi takdirde, yeni bir dizi bulunana kadar mevcut öğenin kalan öğelerini kontrol edin.
başarmak
İşin çoğu daha önce yapıldı, bu nedenle yalnızca koda çevrilmesi gerekiyor:
const flatten = (dizi) = > { eğer (dizi === || arr.length === 0) dönüş; const newArr =; flattenHelper (newArr, arr); return newArr; }; const flattenHelper = (newArr, currentArr) = > { for (let i = 0; i < currentArr.length; i ++) { if (Array.isArray (currentArr )) { flattenHelper (newArr, currentArr ); } else if (currentArr ! ==) { newArr.push (currentArr ); } } }; const arr =; console.log (flatten (arr)); // 1,2,3,4,5Uygulamayı kontrol edin
Kodu yazdıktan sonra 1-2 örneği doğrulamak ve tüm programı çalıştırmak biraz zaman alır. Mülakat süreciniz programların çalıştırılmasını gerektirse bile, tüm kodu görsel olarak kontrol etmeniz gerekir.
Değerlendirme yapıldı
Değerlendirme adımında, algoritmanın karmaşıklığını ve geliştirilebilecek alanları vermeniz gerekir. Çalışma süresi ile ilgili olarak, N'nin dizi olmayan elemanların sayısı olduğu O (N) 'ye ulaştık. Uzay karmaşıklığı da O (N) 'dir, çünkü bir dizi N elemanı oluşturduk. Unutulmaması gereken bir diğer nokta da uzayın doğrusal olmasıdır. Girdi dizisindeki her elemana en az bir kez erişmemiz gerektiğinden algoritma geliştirilemez.
Ek olarak, bu problemde azaltma ve birleştirmeyi de kullanabiliriz. Sözde kod yazmak için bu yöntemleri kullanmaya alışkınsanız, bu daha iyi olur, ancak kavramsal olarak düz kod kullanmanın daha kolay olduğunu düşünüyorum.
Deneyim
Kod problemlerini çözmenin tek bir doğru cevabı yoktur. Algoritmik problemlerin güzelliği budur. Sorunu çözme fikri ve yolu görüşmecinin size farklı bakmasını sağlayacaktır.
Son olarak, birçok soru için, girdinin isteğe bağlı olarak büyük olabileceğini, çağrı yığınının üst sınırına ulaşabilecek kadar büyük olabileceğini varsaymamız gerektiğine dikkat edilmelidir, bu nedenle görüşmeyi yapan kişiye çağrı yığınının üst sınırı hakkında önceden soru sorulmalıdır. Görüşmeyi yapan kişi çağrı yığınının üst sınırını dikkate almamız gerektiğini belirtirse, yinelemeli işlevi yinelemeli bir şekilde uyarlamalı ve çağrı yığınını kendimiz korumalıyız. Bu problemle başka bir büyük şirketle görüşürken karşılaştım. Yineleme ve yinelemeli kod yazmayı öğrenmenin yanı sıra, yinelemeli işlevleri ve yinelemeli işlevleri birbirine nasıl dönüştüreceğinizi de öğrenmelisiniz.
Orijinal: https://medium.com/better-programming/solving-facebooks-2020-front-end-engineering-interview-f34dd6b2a977
Bu makale bir CSDN çevirisidir, lütfen yeniden basımın kaynağını belirtin.
Zhu Guangquan ve Li Jiaqi'nin canlı yayını düştü, 120 milyon kişi çevrimiçiydi, vb.
"Anti-salgın" yeni taktikler: DSÖ, IBM, Oracle ve Microsoft ile birlikte bir açık veri blok zinciri projesi oluşturdu!
Hızlı bir şekilde bir diyalog robotu oluşturmak için bu numarayı kullanın!
Neden izleme ve kayıt yok? Eski programcılar
"Anti-salgın" yeni taktikler: DSÖ, IBM, Oracle ve Microsoft ile birlikte bir açık veri blok zinciri projesi oluşturdu!
4D kuru mallar: konteynerler üzerinde nasıl sürekli dağıtım oluşturacağınızı adım adım öğretin!
Bunun çağdaş ineklerin [teknik kanatları] olduğu söyleniyor ...
Bugünün refahı: yorum alanı seçildi, çevrimiçi 299 yuan değerinde "2020 AI Geliştiricileri Konferansı" nı alabilirsiniz Bir canlı bilet . Parmaklarınızı hareket ettirin ve söylemek istediklerinizi yazın.