5 مشکل رایج مصاحبه جاوا اسکریپت: تجزیه و تحلیل و راه حل

5 مشکل رایج مصاحبه جاوا اسکریپت: تجزیه و تحلیل و راه حل

از مترجم: مقاله ای برای شما منتشر کرد ماریا آنتونیتا پرنا، که در مورد وظایف معمولی جاوا اسکریپت صحبت می کند، اغلب در مصاحبه ها به متقاضیان-توسعه دهندگان ارائه می شود. مقاله اول از همه برای برنامه نویسان تازه کار مفید خواهد بود.

مصاحبه در شرکت‌های فناوری مدت‌هاست که بحث شهر بوده است. این تعجب آور نیست - تکمیل موفقیت آمیز مصاحبه به شما امکان می دهد شغل خوبی پیدا کنید. اما این چندان آسان نیست، زیرا اغلب برای حل مشکلات پیچیده ضروری است.

علاوه بر این، اغلب این وظایف به کاری که متقاضی انجام خواهد داد مربوط نمی شود، اما هنوز باید حل شوند. گاهی اوقات باید این کار را روی برد، بدون چک کردن با گوگل یا هر منبع دیگری انجام دهید. بله، شرایط به تدریج در حال تغییر است و در برخی از شرکت ها از چنین مصاحبه هایی امتناع می کنند، اما بسیاری از کارفرمایان همچنان به این سنت پایبند هستند. این مقاله به تجزیه و تحلیل وظایف معمولی جاوا اسکریپت اختصاص دارد که اغلب به عنوان وظایف برای متقاضیان استفاده می شود.

یادآوری می کنیم: برای همه خوانندگان "Habr" - تخفیف 10 روبل هنگام ثبت نام در هر دوره Skillbox با استفاده از کد تبلیغاتی "Habr".

Skillbox توصیه می کند: دوره عملی "موبایل توسعه دهنده PRO".

نکته اصلی این است که به دقت برای مصاحبه خود آماده شوید.

بله، قبل از شروع به تفکیک وظایف، اجازه دهید به چند نکته کلی برای آماده شدن برای مصاحبه نگاه کنیم.

نکته اصلی این است که از قبل آماده شوید. بررسی کنید که چقدر الگوریتم ها و ساختارهای داده را به خاطر می آورید و دانش خود را در زمینه هایی که خیلی با آنها آشنا نیستید بهبود ببخشید. پلتفرم های آنلاین زیادی وجود دارد که به شما کمک می کند برای مصاحبه آماده شوید. ما توصیه می کنیم geeksforgeeks, پرمپ, Interviewing.io и کد سیگنال.

ارزش یادگیری تلفظ تصمیم را با صدای بلند دارد. توصیه می شود به متقاضیان بگویید که چه کاری انجام می دهید و فقط روی تخته ننویسید (یا کد را در رایانه تایپ کنید، همچنین بی صدا). بنابراین، اگر در کد اشتباه کردید، اما راه حل به طور کلی درست بود، می توانید شانس موفقیت خود را افزایش دهید.

قبل از شروع راه حل باید مشکل را درک کرد. در برخی موارد می توانید به صورت سطحی تکلیف را درک کنید و سپس مسیر اشتباه را طی کنید. شاید ارزش داشته باشد که چند سوال روشنگر از مصاحبه کننده بپرسید.

شما باید کدنویسی را با دست تمرین کنید، نه روی رایانه شخصی. این اتفاق می افتد که در مصاحبه ها به متقاضی یک نشانگر و یک تابلو داده می شود که در آن هیچ درخواست یا قالب بندی خودکار وجود ندارد. وقتی به دنبال راه حل هستید، کد خود را روی یک تکه کاغذ یا درست روی تخته یادداشت کنید. اگر همه چیز را در ذهن خود نگه دارید، می توانید یک چیز مهم را فراموش کنید.

وظایف الگو در جاوا اسکریپت

احتمالاً قبلاً با برخی از این وظایف آشنا هستید. یا در مصاحبه هایی شرکت می کردید که باید چیزی مشابه را حل می کردید، یا در حین یادگیری جاوا اسکریپت روی آنها تمرین می کردید. خوب، اکنون زمان آن رسیده است که دوباره آنها را حل کنیم، و با توضیح مفصل در مورد روند.

پالیندروم

پالیندروم کلمه، جمله یا دنباله ای از کاراکترها است که هم در جهت معمول و هم در جهت مخالف دقیقاً یکسان خوانده می شود. به عنوان مثال، «آنا» یک پالیندروم است، اما «میز» و «جان» نیستند.

صحنه سازی

با توجه به یک رشته؛ شما باید تابعی بنویسید که به شما امکان می دهد اگر رشته یک palindrome است true را برگردانید و در غیر این صورت false. در این مورد باید فاصله ها و علائم نگارشی را در نظر گرفت.

palindrome ('racecar') === درست است
palindrome('table') === false

تجزیه تکلیف

ایده اصلی در اینجا این است که رشته را به عقب برگردانید. اگر رشته "معکوس" کاملاً با رشته اصلی یکسان باشد، یک پالیندروم دریافت می کنیم و تابع باید true باشد. اگر نه، نادرست است.

تصمیم

در اینجا کدی وجود دارد که به شما امکان می دهد تا پالیندروم را حل کنید.

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() (کتابخانه String) به آرایه تبدیل کنید. سپس آرایه را با استفاده از .reverse() معکوس می کنیم (کتابخانه آرایه). آخرین مرحله تبدیل آرایه معکوس به رشته با استفاده از .join() (کتابخانه آرایه) است.

اکنون تنها چیزی که لازم است این است که رشته "معکوس" را با رشته اصلی مقایسه کنید و نتیجه را درست یا نادرست برگردانید.

fizzbuzz

یکی از محبوب ترین مصاحبه های شغلی.

صحنه سازی

لازم است تابعی بنویسید که اعداد 1 تا n را به کنسول نمایش دهد، جایی که n یک عدد صحیح است که تابع به عنوان پارامتر می گیرد، با شرایط زیر:

  • خروجی fizz به جای مضرب 3.
  • خروجی buzz به جای مضربی از 5.
  • خروجی fizzbuzz به جای مضرب 3 و 5.

مثال

Fizzbuzz (5)

نتیجه

// 1
// 2
//فوز
// 4
// وزوز

تجزیه تکلیف

نکته اصلی در اینجا روش یافتن چندگانه با استفاده از جاوا اسکریپت است. می توان آن را با استفاده از عملگر مدول یا باقیمانده -% پیاده سازی کرد که به شما امکان می دهد هنگام تقسیم دو عدد باقیمانده را نشان دهید. اگر باقیمانده 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 را دارد: با یک شرط دوتایی (&&) شروع می شود و با حالتی که اعداد متعدد پیدا نمی شوند، پایان می یابد. در نتیجه همه گزینه ها را پوشش می دهیم.

ریشه کلمه

این نام کلمه ای است که تمام حروف یک کلمه دیگر را به یک عدد اما به ترتیب متفاوت در خود دارد.

صحنه سازی

باید تابعی بنویسیم که بررسی کند آیا دو رشته آناگرام هستند یا نه، و کوچک بودن حروف مهم نیست. فقط کاراکترها به حساب می آیند. فاصله ها یا علائم نگارشی در نظر گرفته نمی شود.

anagram('finder', 'Friend') --> true
anagram('hello', 'bye') --> false

تجزیه تکلیف

در اینجا مهم است که در نظر بگیرید که لازم است هر حرف را در دو خط ورودی و تعداد آنها را در هر خط بررسی کنید.

یاب -> f: 1 دوست -> f: 1
i: 1 r: 1
n: 1 من: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

برای ذخیره سازی داده های آناگرام، باید ساختاری مانند شی جاوا اسکریپت را انتخاب کنید. کلید در این مورد شخصیت حرف است، مقدار آن تعداد تکرار آن در خط فعلی است.

شرایط دیگری نیز وجود دارد:

  • شما باید مطمئن شوید که مورد حروف در هنگام مقایسه در نظر گرفته نمی شود. فقط هر دو رشته را به حروف کوچک یا بزرگ تبدیل کنید.
  • ما همه غیر شخصیت ها را از مقایسه حذف می کنیم. بهترین کار برای عبارات با قاعده.

تصمیم

// 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() null را برمی گرداند.

فیبوناچی

یک وظیفه کلاسیک که در مصاحبه های سطوح مختلف قابل انجام است. شایان ذکر است که دنباله فیبوناچی مجموعه ای از اعداد است که هر عدد بعدی حاصل جمع دو عدد قبلی است. بنابراین، ده عدد اول به این صورت است: 0، 1، 1، 2، 3، 5، 8، 13، 21، 34.

صحنه سازی

باید تابعی بنویسید که nامین رکورد را در یک دنباله مشخص برمی گرداند و n عددی است که به عنوان آرگومان به تابع ارسال می شود.

فیبوناچی (3) // --> 2

این وظیفه شامل حلقه زدن از طریق تعداد دفعات مشخص شده در آرگومان، برگرداندن مقدار در موقعیت مناسب است. این روش برای تنظیم مشکل نیاز به استفاده از حلقه ها دارد. اگر به جای آن از Recursion استفاده کنید، ممکن است مصاحبه کننده آن را دوست داشته باشد و چند امتیاز اضافی به شما بدهد.

تصمیم

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 توصیه می کند:

منبع: www.habr.com

اضافه کردن نظر