ما هو الـ Problem Solving في البرمجة؟ وإزاي تبدأ فيه من الصفر

الـ Problem Solving (حل المشكلات) هو المهارة اللي بتفرّق بين شخص بيحفظ أكواد وشخص بيعرف يفكر. وهو كمان أول حاجة بتتسأل عنها تقريبًا في أي انترفيو برمجة.

في المقال ده هنفهم يعني إيه Problem Solving، وليه الشركات بتهتم بيه، وإزاي تبدأ فيه خطوة بخطوة حتى لو لسه في أول الطريق.

يعني إيه Problem Solving؟

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

الفرق بين البرمجة والـ Problem Solving

  • البرمجة: إنك تعرف تكتب الكود (الصيغة والأدوات).
  • الـ Problem Solving: إنك تعرف إيه اللي تكتبه أصلًا (الفكرة والتحليل).
  • اللغة مجرد أداة، والفكرة هي الأهم.

ليه الشركات بتسأل عنه في الانترفيو؟

لأن الشركة مش بتدور على حد حافظ أمر معين، بتدور على حد يقدر يتعامل مع مشاكل جديدة. أسئلة الـ Problem Solving بتقيس:

  • طريقة تفكيرك وتحليلك للمشكلة.
  • قدرتك على اختيار الحل والهيكل المناسب.
  • فهمك للأداء (سرعة الحل واستهلاكه للذاكرة).
  • طريقة شرحك لحلك بصوت عالي.

خطوات حل أي مسألة

  1. افهم المسألة: اقرأها مرتين وحدد المدخلات والمخرجات.
  2. جرّب أمثلة صغيرة: حلها بإيدك على ورقة، وجرّب حالات خاصة (مدخل فاضي، رقم واحد).
  3. ابدأ بأبسط حل: حتى لو بطيء (Brute Force).
  4. حسّن الحل: اسأل نفسك: إيه اللي بيتكرر؟ وهل فيه هيكل بيانات أنسب؟
  5. اكتب الكود: بعد ما الفكرة تبقى واضحة.
  6. اختبر: على أمثلتك وعلى الحالات الحدية.

مثال عملي: مجموع رقمين (Two Sum)

المسألة: عندك مصفوفة أرقام ورقم هدف، وعايز تلاقي موقعين مجموع الرقمين فيهم يساوي الهدف.

الحل الأبسط (Brute Force)

نجرب كل زوج ممكن. الحل صحيح لكنه بطيء لما المصفوفة تكبر:

for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
        if (a[i] + a[j] == target)
            return {i, j};   // O(n^2)

الحل الأسرع بالـ Hash Map

بدل ما نجرب كل الأزواج، نمشي مرة واحدة ونسأل: هل الرقم المكمّل اتشاف قبل كده؟

unordered_map<int, int> seen;
for (int i = 0; i < n; i++) {
    int need = target - a[i];
    if (seen.count(need))
        return {seen[need], i};
    seen[a[i]] = i;          // O(n)
}
الفكرةالتحسين جه من اختيار هيكل بيانات مناسب (unordered_map)، مش من كتابة كود أطول. دي بالظبط مهارة الـ Problem Solving.

كام عملية تقدر تنفذها في الثانية؟

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

حجم المدخلات nأقصى تعقيد مقبول تقريبًا
حتى 10O(n!)
حتى 20O(2^n)
حتى 500O(n^3)
حتى 5,000O(n^2)
حتى 1,000,000O(n log n)
حتى 100,000,000O(n)
ملاحظةالأرقام دي قاعدة تقريبية، وبتتغير حسب المنصة والمسألة.

الأنماط اللي لازم تتعلمها

  • المصفوفات والنصوص.
  • الترتيب والبحث.
  • الـ Hashing (map و set).
  • الـ Two Pointers.
  • الـ Recursion والـ Backtracking.
  • الـ Greedy.
  • الـ Dynamic Programming.
  • الـ Graphs.
مذاكـــــــــرة الأمتحانات 89
ابدأ بأساس صحالمستوى 2: C++ STL وهياكل البيانات الأساسية، الأدوات اللي هتحتاجها في أي حل.شوف المستوى 2

إزاي تتدرب صح؟

  • فكّر في المسألة من 30 إلى 45 دقيقة قبل ما تفتح الحل.
  • لو مقدرتش، اقرأ تلميح واحد بس وارجع جرّب تاني.
  • بعد ما تعرف الحل، اكتبه من الأول بإيدك من غير نسخ.
  • سجّل النمط اللي اتعلمته في ملف ملاحظات.
  • راجع المسائل اللي غلطت فيها بعد أسبوع.
غلطة شائعةقراءة الحل بعد 5 دقايق من المحاولة. كده بتحرم عقلك من التدريب الحقيقي.

أسئلة شائعة

الـ Problem Solving موهبة ولا بيتعلم؟

بيتعلم بالتدريب المنتظم. ناس كتير بتبدأ ببطء وبتتحسن بسرعة لما تمشي على نظام.

أبدأ بأنهي موقع؟

ابدأ بمسائل Easy في LeetCode، وبعد ما تتمكن منها اتدرج للمتوسطة. المهم تمشي بالترتيب حسب الصعوبة.

لازم أتعلم Data Structures قبل ما أبدأ؟

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

محتاج رياضيات؟

الأساسيات تكفي في الأول، والرياضيات بتتعلمها تدريجي لما توصل للمسائل المتقدمة.

مذاكـــــــــرة الأمتحانات 95
جاهز للانترفيو؟دبلومة الـ Interview: 75 مسألة من LeetCode مختارة لتغطية أهم الأنماط.شوف الدبلومة

وتقدر تتابع شرح المسائل فيديو على قناة Mr Algorithms على يوتيوب.

اترك ردّاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *