5 مهام نموذجية لمقابلات JavaScript: التحليل والحلول



من أحد المترجمين: نشرنا لك مقالة كتبها ماريا بيرنا (ماريا أنتونيتا بيرنا) ، والتي تتحدث عن المهام النموذجية في جافا سكريبت ، وغالبًا ما يتم تقديمها للباحثين عن عمل الباحثين عن عمل في المقابلات. هذه المادة ستكون مفيدة في المقام الأول للمبرمجين المبتدئين. فيما يلي أمثلة لحل المشكلات ، إذا بدا لك أنها ليست جيدة جدًا ، وهناك خيار أفضل - اقترح بديلاً في التعليقات.

لطالما كانت المقابلات في شركات التكنولوجيا بمثابة كلمة مرور. هذا لا يجب أن يفاجأ - المقابلة الناجحة تمنحك الفرصة للحصول على وظيفة جيدة. ولكن هذا ليس بهذه البساطة ، لأنه غالبا ما يكون من الضروري حل المشاكل المعقدة.

وفي أغلب الأحيان ، لا ترتبط معظم هذه المهام بالعمل الذي سيؤديه مقدم الطلب ، لكنها لا تزال بحاجة إلى حل. في بعض الأحيان ، يتعين عليك القيام بذلك على السبورة ، دون التحقق من Google أو أي مصدر آخر. نعم ، يتغير الوضع تدريجياً ، وترفض بعض الشركات إجراء مثل هذه المقابلات ، لكن العديد من أرباب العمل ما زالوا يلتزمون بهذا التقليد. هذه المقالة مخصصة لتحليل مهام جافا سكريبت النموذجية ، والتي تستخدم غالبًا كمهام لمقدمي الطلبات.

نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز الترويجي "Habr".

توصي Skillbox بما يلي: دورة عملية "Mobile Developer PRO" .

الشيء الرئيسي هو الاستعداد الدقيق لمقابلتك


نعم ، قبل البدء في تفكيك المهام ، دعونا نلقي نظرة على نصائح عامة للتحضير للمقابلة.

الشيء الرئيسي هو التحضير مقدما. تحقق من مدى تذكرك للخوارزميات وهياكل البيانات ، واسحب المعرفة في المناطق التي لا تعرفها جيدًا. هناك العديد من المنصات عبر الإنترنت التي تساعد في التحضير للمقابلات. نوصي بـ GeeksforGeeks و Pramp و Interviewing.io و CodeSignal .

يجدر تعلم نطق القرار بصوت عالٍ. يُنصح بإخبار المتقدمين بما تفعله ، وليس فقط الكتابة على السبورة (أو كتابة الكود في الكمبيوتر ، أيضًا بصمت). وبالتالي ، إذا ارتكبت خطأً في الكود ، لكن القرار سيكون صحيحًا بشكل عام ، يمكنك زيادة فرصك في النجاح.

يجب فهم المشكلة قبل متابعة الحل. في بعض الحالات ، يمكنك فهم المهمة بشكل سطحي ثم السير في الطريق الخطأ. قد يكون من المفيد طرح بعض الأسئلة التوضيحية على القائم بإجراء المقابلة.

تحتاج إلى ممارسة كتابة التعليمات البرمجية يدويًا ، وليس على جهاز كمبيوتر. يحدث أنه أثناء المقابلات يتم إعطاء علامة ومجلس إدارة حيث لا توجد نصائح أو التنسيق التلقائي. عند البحث عن حل ، اكتب الرمز الخاص بك على قطعة من الورق أو مباشرة على السبورة. إذا وضعت كل شيء في الاعتبار ، يمكنك أن تنسى شيئًا مهمًا.

مهام قالب جافا سكريبت


ربما تكون بعض هذه المهام مألوفة لك بالفعل. إما أنك مرت بمقابلات حيث كان عليك حل شيء مشابه ، أو قمت بممارستها أثناء تعلم JavaScript. حسنًا ، حان الوقت لحلها مرة أخرى ، مع شرح مفصل للعملية.

سياق متناظر

palindrome هي كلمة أو جملة أو تسلسل من الأحرف التي يمكن قراءتها كما هي ، سواء في الاتجاه المعتاد أو في الاتجاه المعاكس. على سبيل المثال ، "Anna" هي طبقة متناظرة ، لكن "table" و "John" ليست كذلك.

إنتاج

إعطاء سلسلة ؛ تحتاج إلى كتابة وظيفة تسمح لك بالعودة صوابًا إذا كانت السلسلة متناظرة ، وغير صحيحة إن لم تكن كذلك. في هذه الحالة ، تحتاج إلى مراعاة المسافات وعلامات الترقيم.

palindrome ('racecar') === صحيح
palindrome ('table') === false

نحن تفكيك المهمة

الفكرة الرئيسية هنا هي قلب الخط في الاتجاه المعاكس. إذا كان الخط "العكسي" مطابقًا تمامًا للخط الأصلي ، فحينئذٍ حصلنا على متناظرة ويجب أن تعود الوظيفة إلى حقيقة. إذا لم يكن كذلك ، خطأ.

قرار

هنا هو الرمز الذي يحل palindrome.

const palindrome = str => { // turn the string to lowercase str = str.toLowerCase() // reverse input string and return the result of the // comparisong return str === str.split('').reverse().join('') } 

الخطوة الأولى هي تحويل أحرف سلسلة الإدخال إلى أحرف صغيرة. هذا هو ضمان أن البرنامج سوف يقارن بالضبط الشخصيات نفسها ، وليس القضية أو أي شيء آخر.

والخطوة الثانية هي عكس الخط. من السهل القيام بذلك: تحتاج إلى تحويله إلى صفيف باستخدام طريقة .split () (مكتبة السلسلة). ثم نقلب المجموعة باستخدام .reverse () (مكتبة الصفيف). الخطوة الأخيرة هي تحويل الصفيف العكسي إلى سلسلة باستخدام .join () (مكتبة صفيف).

الآن كل ما نحتاج إليه هو مقارنة السلسلة "العكسية" بالسلسلة الأصلية ، وإرجاع النتيجة صحيحة أو خاطئة.

FizzBuzz

واحدة من المهام المقابلة الأكثر شعبية.

إنتاج

يجب كتابة دالة تعرض الأرقام من 1 إلى n على وحدة التحكم ، حيث n عبارة عن عدد صحيح تأخذه المعلمة كمعلمة ، بالشروط التالية:

  • إخراج الدهون بدلا من مضاعفات 3 ؛
  • إخراج buzz بدلاً من مضاعفات 5؛
  • إخراج fizzbuzz بدلاً من الأرقام التي هي مضاعفات كل من 3 و 5.

مثال

Fizzbuzz (5)

يؤدي

// 1
// 2
// fizz
// 4
// الطنانة

نحن تفكيك المهمة

الشيء الرئيسي هنا هو طريقة البحث عن أرقام متعددة باستخدام JavaScript. يمكن تنفيذه باستخدام مشغل الوحدة النمطية أو الباقي -٪ ، مما يتيح لك إظهار الباقي عند قسمة رقمين. إذا كان الباقي يساوي 0 ، فهذا يعني أن الرقم الأول هو مضاعف الرقم.

12٪ 5 // 2 -> 12 ليس مضاعف 5
12٪ 3 // 0 -> 12 مضاعفة 3

لذلك ، إذا قسّمنا 12 على 5 ، نحصل على 2 مع الباقي 2. إذا قسّمنا 12 على 3 ، نحصل على 4 مع الباقي 0. في الحالة الأولى ، 12 ليست مضاعفة 5 ، في الثانية - 12 هي مضاعفة 3.

قرار

سيكون الحل الأفضل هو الكود التالي:

 const fizzBuzz = num => { for(let i = 1; i <= num; i++) { // check if the number is a multiple of 3 and 5 if(i % 3 === 0 && i % 5 === 0) { console.log('fizzbuzz') } // check if the number is a multiple of 3 else if(i % 3 === 0) { console.log('fizz') } // check if the number is a multiple of 5 else if(i % 5 === 0) { console.log('buzz') } else { console.log(i) } } } 

تقوم الوظيفة بإجراء الفحوصات اللازمة باستخدام عبارات شرطية وتنتج النتيجة التي يحتاجها المستخدم. يجب أن تنتبه المهمة لترتيب عبارات if ... else: ابدأ بشرط مزدوج (&&) وانتهي بالحالة عندما يتعذر العثور على أرقام متعددة. نتيجة لذلك ، نحن نغطي جميع الخيارات.

إعادة ترتيب الأحرف

هذا هو اسم الكلمة التي تحتوي على جميع أحرف كلمة أخرى بنفس الكمية ، ولكن بترتيب مختلف.

إنتاج

تحتاج إلى كتابة وظيفة تتحقق مما إذا كان سطرين من الجناس ، وحالة الحروف لا تهم. تؤخذ فقط الأحرف في الاعتبار ؛ لا تؤخذ المسافات أو علامات الترقيم في الاعتبار.

الجناس الناقص ('مكتشف' ، 'صديق') -> صحيح
الجناس الناقص ('مرحبا' ، 'وداعا') -> خطأ

نحن تفكيك المهمة

من المهم مراعاة أنه من الضروري التحقق من كل حرف في سطرين إدخال ورقمهما في كل سطر.

مكتشف -> f: 1 صديق -> f: 1
أنا: 1 ص: 1
n: 1 i: 1
d: 1 e: 1
ه: 1 ن: 1
ص: 1 د: 1

لتخزين بيانات الجناس ، يجب عليك اختيار بنية مثل كائن JavaScript الحرفي. المفتاح في هذه الحالة هو رمز الحرف ، والقيمة هي عدد التكرارات في السطر الحالي.

هناك شروط أخرى:

  • تحتاج إلى التأكد من عدم مراعاة حالة الأحرف عند المقارنة. فقط قم بتحويل كلا السلاسل إلى أحرف صغيرة أو كبيرة.
  • نستبعد من المقارنة جميع الأحرف غير. من الأفضل العمل مع التعبيرات العادية .

قرار

 // helper function that builds the // object to store the data const buildCharObject = str => { const charObj = {} for(let char of str.replace(/[^\w]/g).toLowerCase()) { // if the object has already a key value pair // equal to the value being looped over, // increase the value by 1, otherwise add // the letter being looped over as key and 1 as its value charObj[char] = charObj[char] + 1 || 1 } return charObj } // main function const anagram = (strA, strB) => { // build the object that holds strA data const aCharObject = buildCharObject(strA) // build the object that holds strB data const bCharObject = buildCharObject(strB) // compare number of keys in the two objects // (anagrams must have the same number of letters) if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) { return false } // if both objects have the same number of keys // we can be sure that at least both strings // have the same number of characters // now we can compare the two objects to see if both // have the same letters in the same amount for(let char in aCharObject) { if(aCharObject[char] !== bCharObject[char]) { return false } } // if both the above checks succeed, // you have an anagram: return true return true } 

لاحظ استخدام Object.keys () في المقتطف أعلاه. تقوم هذه الطريقة بإرجاع صفيف يحتوي على الأسماء أو المفاتيح بنفس الترتيب الذي تظهر به في الكائن. في هذه الحالة ، سيكون الصفيف مثل هذا:

['f' ، 'i' ، 'n' ، 'd' ، 'e' ، 'r']

وبالتالي ، نحصل على خصائص الكائن دون الحاجة إلى إجراء دورة حجم. في هذه المهمة ، يمكنك استخدام هذه الطريقة مع خاصية .length - للتحقق مما إذا كان نفس عدد الأحرف في كلا الخطين - وهذه ميزة مهمة من الجناس.

بحث حرفي

مهمة بسيطة إلى حد ما وغالبًا ما تأتي عبر المقابلات.

إنتاج

تحتاج إلى كتابة دالة تأخذ سلسلة كوسيطة وتقوم بإرجاع عدد حروف العلة المضمنة في السلسلة.
الحروف المتحركة هي "a" ، "e" ، "i" ، "o" ، "u".

مثال:

findVowels ('hello') // -> 2
findVowels ('why') // -> 0

قرار

هنا هو الخيار الأسهل:

 const findVowels = str => { let count = 0 const vowels = ['a', 'e', 'i', 'o', 'u'] for(let char of str.toLowerCase()) { if(vowels.includes(char)) { count++ } } return count } 

من المهم الانتباه إلى استخدام طريقة .includes (). وهو متاح لكلا السلاسل والمصفوفات. يجب استخدامه لتحديد ما إذا كان صفيف يحتوي على قيمة محددة. تقوم هذه الطريقة بإرجاع true إذا كان الصفيف يحتوي على القيمة المحددة ، و false إن لم يكن.

يوجد حل أكثر إيجازًا للمشكلة:

 const findVowels = str => { const matched = str.match(/[aeiou]/gi) return matched ? matches.length : 0 } 

يتضمن هذا الأسلوب .match () ، والذي يسمح لك بتنفيذ بحث فعال. إذا تم العثور على التعبير العادي كوسيطة للأسلوب داخل السلسلة المحددة ، فإن صفيف الحروف المطابقة يصبح القيمة التي يتم إرجاعها. حسنًا ، إذا لم تكن هناك تطابقات ، فسوف تُرجع .match () لاغية.

فيبوناتشي

مهمة كلاسيكية يمكن العثور عليها في المقابلات على مختلف المستويات. تجدر الإشارة إلى أن تسلسل فيبوناتشي عبارة عن سلسلة من الأرقام ، حيث يكون كل لاحقة هو مجموع الرقمين السابقين. لذلك ، الأرقام العشرة الأولى هي كما يلي: 0 ، 1 ، 1 ، 2 ، 3 ، 5 ، 8 ، 13 ، 21 ، 34.

إنتاج

نحتاج إلى كتابة دالة تُرجع السجل nth في تسلسل معين ، و n هو الرقم الذي يتم تمريره كوسيطة للدالة.

فيبوناتشي (3) // -> 2

تتضمن هذه المهمة تكرار الحلقات عدة مرات كما هو محدد في الوسيطة ، مع إعادة القيمة في الموضع المناسب. طريقة بيان المشكلة هذه تتطلب استخدام الدورات. إذا كنت تستخدم العودية بدلاً من ذلك ، فقد يعجبك القائم بإجراء المقابلة ويعطيك بعض النقاط الإضافية.

قرار

 const fibonacci = num => { // store the Fibonacci sequence you're going // to generate inside an array and // initialize the array with the first two // numbers of the sequence const result = [0, 1] for(let i = 2; i <= num; i++) { // push the sum of the two numbers // preceding the position of i in the result array // at the end of the result array const prevNum1 = result[i - 1] const prevNum2 = result[i - 2] result.push(prevNum1 + prevNum2) } // return the last value in the result array return result[num] } 

في صفيف النتائج ، يوجد أول رقمين في صف واحد ، حيث أن كل سجل في التسلسل يتكون من مجموع الرقمين السابقين. في البداية ، لا يوجد رقمان يمكنك الحصول عليهما للحصول على الرقم التالي ، لذلك لا يمكن للدورة إنشاءهما في الوضع التلقائي. ولكن ، كما نعلم ، يكون الرقمان الأوليان دائمًا 0 و 1. لذلك ، يمكنك تهيئة مجموعة من النتائج يدويًا.

بالنسبة للتكرار ، كل شيء هنا أبسط وأكثر تعقيدًا في نفس الوقت:

 const fibonacci = num => { // if num is either 0 or 1 return num if(num < 2) { return num } // recursion here return fibonacci(num - 1) + fibonacci(num - 2) } 

ما زلنا ندعو فيبوناتشي () ، ويمر بأعداد أصغر باستمرار كوسائل نتوقف عندما تكون الحجة التي تم تمريرها هي 0 أو 1.

استنتاج


على الأرجح ، واجهت بالفعل أي من هذه المهام إذا تمت مقابلتك عن عمل مطور الواجهة الأمامية أو جافا سكريبت (خاصة إذا كان هذا هو المستوى المبتدئ). لكن إذا لم يأتوا إليك ، فيمكنهم أن يكونوا في متناول اليد في المستقبل - على الأقل من أجل التنمية العامة.
توصي Skillbox بما يلي:

Source: https://habr.com/ru/post/ar445360/


All Articles