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

توی این مطلب اول با یه روش ساده شروع میکنیم (دو حلقه تو در تو)، بعد سراغ یه راه بهینهتر میریم که با استفاده از دیکشنری و تنها یک حلقه این مشکل رو خیلی سریعتر حل میکنه. پس اگه دنبال بهینهسازی کدت هستی یا برای مصاحبههای کاری آماده میشی، این مطلب قطعاً به کارت میاد!
فرض کن یه آرایه داریم مثل این:
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);
اینجا، برای هر عدد، مکملش (یعنی عددی که باهاش جمع بشه و ۱۰ بده) رو حساب میکنیم. بعد چک میکنیم که آیا قبلاً این مکمل توی دیکشنری بوده یا نه. اگه بوده یعنی قبلاً یه عدد داشتیم که با عدد فعلی جمعش ۱۰ میشه و ایندکس اون دوتا رو ذخیره میکنیم. این روش خیلی سریعتر و بهینهتره.
اگه این چالش برات مفید یا جالب بود، خوشحال میشم با دوستات به اشتراک بذاری یا توی کامنتها نظرت رو بگی! یاد گرفتن روشهای مختلف برای حل یه مسئله نهتنها مهارتت رو توی کدنویسی بالا میبره، بلکه توی مصاحبهها هم میتونه برگ برندهت باشه. یادت نره که همیشه دنبال روشهای سریعتر و بهینهتر باشی—اونجاست که یه برنامهنویس معمولی، به یه برنامهنویس حرفهای تبدیل میشه!
