لماذا أصبح LeetCode ساحة تدريب لمطوري C#؟
\n\nإذا كنت تكتب بلغة C# وتريد الانضمام إلى FAANG (أو مجرد شركة منتجات جيدة)، فستجد نفسك عاجلاً أم آجلاً على LeetCode. هذا ليس مجرد موضة عابرة - بل هو أداة اختيار حقيقية. تخيل: أنت تجيد ASP.NET Core تماماً، وتفهم Entity Framework، ولكن في المقابلة يُطلب منك بناء شجرة ثنائية على السبورة (أو في محرر عبر الإنترنت). وهنا يبدأ السحر.
\n\nفي هذه المقالة، سنشرح بالضبط كيفية حل مشاكل LeetCode بلغة C#، وما هي الخوارزميات وهياكل البيانات التي يجب تعلمها أولاً، وكيفية تحويل حل المشاكل من عذاب إلى مغامرة ممتعة. مفاجأة: C# هي واحدة من أكثر اللغات ملاءمة للمعارك الخوارزمية إذا كنت تعرف حيلها.
\n\nمن أين تبدأ: اختيار الاستراتيجية الصحيحة
\n\nيرتكب العديد من المبتدئين خطأ - يندفعون إلى مشاكل LeetCode C# بسرعة، محاولين حل كل شيء. النتيجة: الإرهاق بعد أسبوع. بدلاً من ذلك، استخدم طريقة "المستويات الثلاثة":
\n\n- \n
- Easy (سهلة) - قاعدتك. فيها تتعلم كتابة الكود دون أخطاء ترجمة من المرة الأولى. \n
- Medium (متوسطة) - الساحة الرئيسية. هنا يتم اختبار القدرة على دمج هياكل البيانات. \n
- Hard (صعبة) - لا تحاولها إلا بعد حل 30-40 مشكلة Medium. وإلا - ألم وإحباط. \n
نصيحة: ابدأ بـ 10 مشاكل Easy لتتذكر بناء جملة C# و LINQ. ثم انتقل إلى Medium. واترك Hard "للحلوى" - عندما تشعر أنك مستعد للبرمجة الديناميكية والرسوم البيانية.
\n\nما هي الخوارزميات التي يجب أن يعرفها مطور C#
\n\nLeetCode ليس عن "حفظ الحل". إنه عن الأنماط. إليك قائمة بالمواضيع التي تظهر في 90% من المشاكل:
\n\n1. المصفوفات وجداول التجزئة (HashSet, Dictionary)
\nملك LeetCode. مشكلة "Two Sum" (LeetCode 1) - بطاقة التعريف. في C# تُحل في سطر واحد باستخدام Dictionary<int, int>:
public int[] TwoSum(int[] nums, int target) {\n var map = new Dictionary<int, int>();\n for (int i = 0; i < nums.Length; i++) {\n int complement = target - nums[i];\n if (map.ContainsKey(complement))\n return new int[] { map[complement], i };\n map[nums[i]] = i;\n }\n return new int[0];\n}\n\nلاحظ: نستخدم Dictionary وليس List. هذا يعطي O(1) للبحث. المهارة الأساسية هي فهم متى يجب التضحية بالذاكرة من أجل السرعة.
2. المكدس والطابور (Stack, Queue)
\nمشاكل الأقواس (Valid Parentheses)، والتدوين البولندي العكسي - كلاسيكيات. في C#، المكدس مطبق كفئة جاهزة Stack<T>:
public bool IsValid(string s) {\n var stack = new Stack<char>();\n foreach (char c in s) {\n if (c == '(') stack.Push(')');\n else if (c == '{') stack.Push('}');\n else if (c == '[') stack.Push(']');\n else if (stack.Count == 0 || stack.Pop() != c) return false;\n }\n return stack.Count == 0;\n}\n\nالحيلة: ندفع القوس المغلق فوراً، ثم نقارن ببساطة. أنيق وسريع.
\n\n3. القوائم المرتبطة (LinkedList)
\nعلى LeetCode، غالباً ما تُعطى مشاكل لعكس القائمة، حذف العقد، البحث عن الدورة. توفر C# LinkedList<T>، لكن في المشاكل عادةً ما يُعطى كلاس خاص ListNode. تعلم العمل مع المؤشرات (المراجع). مثال على العكس:
public ListNode ReverseList(ListNode head) {\n ListNode prev = null;\n while (head != null) {\n ListNode next = head.next;\n head.next = prev;\n prev = head;\n head = next;\n }\n return prev;\n}\n\nلاحظ: لا for ولا foreach - فقط while والعمل مع المؤشرات. هذا يطور التفكير الخوارزمي.