ویرگول
ورودثبت نام
سهیل جعفرنژاد
سهیل جعفرنژاداز سال 2021 وارد دنیای برنامه‌نویسی شدم. زبان موردعلاقه‌ام جاوا اسکریپت است و به‌صورت تخصصی در زمینه فرانت‌اند فعالیت می‌کنم. عاشق یادگیری، تجربه فناوری‌های نو و به‌اشتراک‌گذاری اطلاعاتم با دیگرانم.
سهیل جعفرنژاد
سهیل جعفرنژاد
خواندن ۳ دقیقه·۱ سال پیش

یافتن دو عدد با مجموع مشخص در JavaScript — از روش ساده تا راه‌حل بهینه


سلام 👋
امروز می‌خوام یکی از چالش‌هایی که سر یک مصاحبه کاری باهاش روبه‌رو شدم رو باهاتون به اشتراک بذارم. سوال جالبی بود که ممکنه توی موقعیت‌های زیادی بهش بر بخوریم:

"چطور می‌تونیم اندیس دو عدد از یک آرایه رو پیدا کنیم که مجموع‌شون برابر با یه عدد مشخص باشه؟"

توی این مطلب اول با یه روش ساده شروع می‌کنیم (دو حلقه تو در تو)، بعد سراغ یه راه بهینه‌تر می‌ریم که با استفاده از دیکشنری و تنها یک حلقه این مشکل رو خیلی سریع‌تر حل می‌کنه. پس اگه دنبال بهینه‌سازی کدت هستی یا برای مصاحبه‌های کاری آماده می‌شی، این مطلب قطعاً به کارت میاد!

فرض کن یه آرایه داریم مثل این:

const data = [1, 2, 3, 4, 5, 6, 7, 8, 9];

حالا می‌خوایم ایندکس دوتا عددی که جمعشون ۱۰ می‌شه رو پیدا کنیم.

روش اول: استفاده از دو حلقه تو در تو

یه روش ساده اینه که از دو تا حلقه استفاده کنیم و همه جفت‌ عددهای ممکن رو چک کنیم. اینجوری می‌تونیم ببینیم که آیا جمعشون ۱۰ می‌شه یا نه:

const pairs = []; for (let i = 0; i < data.length; i++) { for (let j = i + 1; j < data.length; j++) { if (data[i] + data[j] === 10) pairs.push([i, j]); } } console.log(pairs);

این کد درسته و جفت‌هایی که مجموعشون ۱۰ می‌شه رو پیدا می‌کنه. ولی مشکلی که داره اینه که از دو تا حلقه تو در تو استفاده می‌کنه، و پیچیدگی زمانی‌اش O(n²) می‌شه، که برای آرایه‌های بزرگ زیاد بهینه نیست.

روش بهینه تر: استفاده از یک حلقه و دیکشنری

برای اینکه روش رو بهینه‌تر کنیم، می‌تونیم از یه دیکشنری استفاده کنیم و مسأله رو با یه حلقه حل کنیم. این روش پیچیدگی زمانی رو به O(n) کاهش می‌ده:

const indexMap = {}; const pairs = []; for (let i = 0; i < data.length; i++) { const complement = 10 - data[i]; if (indexMap.hasOwnProperty(complement)){ pairs.push([indexMap[complement], i]); } indexMap[data[i]] = i; } console.log(pairs);

اینجا، برای هر عدد، مکملش (یعنی عددی که باهاش جمع بشه و ۱۰ بده) رو حساب می‌کنیم. بعد چک می‌کنیم که آیا قبلاً این مکمل توی دیکشنری بوده یا نه. اگه بوده یعنی قبلاً یه عدد داشتیم که با عدد فعلی جمعش ۱۰ می‌شه و ایندکس اون دوتا رو ذخیره می‌کنیم. این روش خیلی سریع‌تر و بهینه‌تره.

خلاصه

  • برای پیدا کردن جفت‌هایی که مجموعشون برابر یه عدد خاصه (مثلاً ۱۰)، می‌تونیم از دو حلقه تو در تو استفاده کنیم؛ ولی این روش O(n²) زمان می‌بره.
  • برای بهینه‌سازی، می‌تونیم از یک دیکشنری و یک حلقه استفاده کنیم تا در زمان O(n) این کار انجام بشه.
  • در روش بهینه، با محاسبه مکمل هر عدد و بررسی وجود اون در دیکشنری، جفت مناسب رو پیدا می‌کنیم.
  • این تکنیک نه‌تنها سریع‌تره، بلکه برای مصاحبه‌های فنی هم یه مثال خیلی خوب از تفکر الگوریتمی و بهینه‌سازی محسوب می‌شه.

از خوندن این مطلب لذت بردی؟

اگه این چالش برات مفید یا جالب بود، خوشحال می‌شم با دوستات به اشتراک بذاری یا توی کامنت‌ها نظرت رو بگی! یاد گرفتن روش‌های مختلف برای حل یه مسئله نه‌تنها مهارتت رو توی کدنویسی بالا می‌بره، بلکه توی مصاحبه‌ها هم می‌تونه برگ برنده‌ت باشه. یادت نره که همیشه دنبال روش‌های سریع‌تر و بهینه‌تر باشی—اونجاست که یه برنامه‌نویس معمولی، به یه برنامه‌نویس حرفه‌ای تبدیل می‌شه!


جاوااسکریپت
۲
۰
سهیل جعفرنژاد
سهیل جعفرنژاد
از سال 2021 وارد دنیای برنامه‌نویسی شدم. زبان موردعلاقه‌ام جاوا اسکریپت است و به‌صورت تخصصی در زمینه فرانت‌اند فعالیت می‌کنم. عاشق یادگیری، تجربه فناوری‌های نو و به‌اشتراک‌گذاری اطلاعاتم با دیگرانم.
شاید از این پست‌ها خوشتان بیاید