استخدام موقع leetcode

استخدام موقع LeetCode | نصائح وحيل للمبتدئين [2023]

أنت على الأغلب أحد الأشخاص الذين سمعوا أكثر من مرة ومن العديد من الأشخاص، أن النجاح بمقابلات العمل الخاصة بالمبرمجين أو المطورين يتطلب النجاح في استخدام موقع leetcode أو أحد المواقع الشبيهة به.

لذلك قمت بتسجيل حساب في الموقع، وبعدها رتبت المسائل الموجودة من الأسهل للأصعب، وبدأت بأسهل مسألة والتي هي (Two sum) وبعد أن قرأت المسألة وحاولت حلها لم تستطع حلها!

حتى بعد أن قرأت النص عدة مرات لم تصل إلى أي فكرة للحل، وهنا يأتي دوري أنا في هذا المقال، والذي سوف أحاول فيه أن أعطيك طريقة جميلة وفعالة لكي تبدء في استخدام موقع leetcode بشكل مفيد ومنتج.

الخوارزميات وتراكيب المعطيات

الخوارزميات وقواعد البيانات (Data structure and algorithm)

قبل البدء في استخدام موقع leetcode يجب عليك أن تعرف أن أي مسألة موجودة على الموقع يعتمد حلها على خوارزمية ما وعلى إحدى تراكيب البيانات في الأغلب.

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

الخوارزميات وتراكيب المعطيات هي أشبه بأداة تساعدنا على حل المسائل بشكل صحيح وسريع، تخيل الأمر كأنك تريد أن تبني منزلاً، فما هو أول شيء سوف تقوم به؟ بالطبع ستحضر الأدوات اللازمة لعملية البناء ومن دون هذه الأدوات ستكون العملية معقدة وصعبة.

أنا أعرف أنك من الممكن أن تتجاهل نصيحتي وتبدء بمحاولة حل المسائل بدون أن تتعلم أساسيات الخوارزميات وتراكيب المعطيات، ولكن هذا سوف يجعل حل المسائل بالنسبة لك أمراً صعباً.

بالطبع من الممكن أن تحل العديد من المسائل بدون معرفة مسبقة بالخوارزميات وتراكيب المعطيات، ولكن اذا أردت أن تتقدم وتحسن مستواك وتحل العديد من المسائل المتوسطة وعالية الصعوبة، فعندها لابد لك من تعلم أساسيات الخوارزميات وتراكيب المعطيات.

طريقة استخدام موقع leetcode

كيف استخدم موقع leetcode

اذاً قررت أن تبدء في استخدام موقع leetcode، هذا قرار صائب.هنا يجب أن تعرف بعض الأمور الأساسية والتي ستلاحظها عند البدء في استخدام الموقع وهي كالتالي:

  • لكل مسألة عنوان: والذي غالباً يحوي تلميح إلى الحل.
  • لكل مسألة وصف: والذي يجب عليك قرأته بتمعن لأنة أي جزء منه قد يحتوي على فكرة تغير طريقة حل المسألة بالكامل.
  • أمثلة على المسألة: تكون على شكل (دخل وخرج) والتي تساعدك على فهم طريقة الحل بشكل أعمق، وبنفس الوقت تستطيع استخدامها لتتأكد من أن حلك صحيح.
  • القيود: وهي عبارة عن المعلومات التي ستساعدك على معرفة درجة التعقيد التي يجب أن يتم الحل بها.
  • اللغة: ويمكنك الإختيار من بين مجموعة واسعة من اللغات من أشهرها: لغة بايثون، لغة سي بلس بلس، ولغة جافا.
  • محرر أكواد: يسمح لك بإختبار الكود الخاص بك داخل الموقع، وقبل أن ترسله كحل للمسألة، وهذه ميزة جميلة جداً، حيث يمكنك تنفيذ الكود من خلال زر (Run) ثم إرساله كحل من خلال زر (Submit).

كيف احل مسألة على موقع leetcode

خطوات حل المسائل على موقع leetcode

وهنا، نكون قد وصلنا إلى الجزء الأهم وهو كيف تبدء في حل المسائل أو بمعنى آخر كيف تبدء في استخدام موقع leetcode  بشكل فعلي.

يوجد 4 خطوات أساسية لحل أي مسألة على leetcode وهي:

  1. قراءة المسألة بهدوء وفهم محتواها: مهما كانت الفكرة التي تخطر ببالك أثناء قرأتك للمسألة، لا تبدء بكتابة (تكويد)الحل وانتظر حتى تنتهي من قرأت المسألة بالكامل، لأنة تفصيل صغير في الوصف الخاص بالمسألة.يكفي لتغيير الحل بشكل جذري، وبالتالي لا تلمس لوحة المفاتيح حتى تفهم كل تفصيل في المسألة.
  2. فكر في كل الحلول الممكنة: استخدم ورقة وقلم لتخيل طريقة حل المسألة وفكر دائماً في الحالات الشاذة، مثل ماذا سوف يحدث اذا كان الدخل صفراً؟، ومتى لن يعمل البرنامج الذي كتبته؟ وما شابه ذلك من الأفكار.التفاصيل الصغيرة غالباً ما تكون سبباً في فشل الكود الخاص بك في حل المسألة.
  3. أبدء بكتابة الكود: هنا، يأتي الجزء الأهم وهو تحويل الأفكار إلى برنامج لحل المسألة.يفضل أن تستخدم لغة برمجة تعرفها جيداً، لأنة العديد من المسائل كما أخبرتك مسبقاً قد تحتاج إلى استخدام تراكيب (المعطيات أو البيانات) وبالتالي يجب أن تعرف كيف تستخدمها في لغة البرمجة الخاصة بك.
  4. اعرف الزمن والتعقيد الخاص بحلك: يجب أن تعتاد على حساب تعقيد الزمن والمساحة الخاص بالبرنامج الذي كتبته، فأنت في مقابلات العمل لن تعطى التعقيد بل سوف تسأل عنه.أيضاً سوف يسهل عليك هذا فهم السبب وراء فشل الحل أو نجاحه في بعض الحالات.
مستويات الصعوبة على موقع leetcode

تختلف المسائل على موقع leetcode في الصعوبة، وتنقسم إلى ثلاث مستويات وهي : (السهل – المتوسط – الصعب).لكن، كون المسألة سهلة كتصنيف لا يعني بالضرورة أنك ستتمكن من حلها بعد إنهاءك لنصها فوراً.

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

مجموعات المسائل على موقع leetcode

يحتوي موقع ليت كود على الكثير من المسائل.أيضاً، يمكنك أن تعرف أي المسائل هي التي يجب أن تحاول حلها تبعاً للتصنيفات المتعلقة بالخوارزميات وبنى المعطيات.بمعنى آخر، يقسم ليت كود المسائل حسب الخوارزمية أو بنى المعطيات التي يجب استخدامها لحلها.

لذلك عند بدءك في استخدام موقع leetcode، نفذ الخطوات التالية لتصل إلى المسائل التي تناسبك.لنقل أنك قد درست مفهوم (Linked list) في بنى المعطيات وتريد أن تحل مسائل متعلقة بهذا المفهوم.عندها، عليك بما يلي:

  1. انقر على (problems) من الشريط الرأسي.
  2. سترى أن المسائل مقسمة حسب المفهوم.مثلاً المصفوفة (Array) ستجد بجانبها رقم مثل (1495) وهو عدد المسائل المتعلقة بهذا المفهوم. وهكذا باقي المفاهيم مثل خوارزمية الطمع (Greedy).
  3. في آخر شريط الخوارزميات وبنى المعطيات الذي تحدثنا عنه في الخطوة (2) ستجد كلمة (Expand). اضغط عليها.
  4. ستتوسع القائمة وستظهر باقي التصنيفات.
  5. ابحث عن (Linked list) واضغط عليها.ستنقل إلى صفحة تحتوي على المسائل المتعلقة بهذا المفهوم.
  6. في قائمة المسائل وتحديداً الشريط الرأسي، ستجد الصعوبة (Difficulty).اضغط عليها مرتين.هكذا تكون قد رتبت المسائل من الأسهل إلى الأصعب.
  7. اضغط على المسألة التي تريد حلها وأبدء العمل!

أقرأ أيضاً: طرق الوصول في لغة السي شارب (Access Modifiers) 2023.

نصائح قبل البدء في استخدام موقع leetcode

نصائح قبل البدء في استخدام موقع leetcode
  1. لا تبحث عن الحل على الموقع أو على الإنترنت إلا بعد أن تحاول عدة مرات وتجرب عدة حلول مختلفة.
  2. فكر وحاول أن تحسب التعقيد الخاص بالحل الذي توصلت إليه، لأنة هذا مهم جداً لمقابلات العمل على مستوى العالم (ربما الوضع مختلف في الوطن العربي).
  3. تذكر أن المهم من استخدام موقع leetcode  هو تطوير مهاراتك ومعرفتك البرمجية، انتبه ! مهاراتك أنت وقدراتك أنت وبالتالي لا تهتم بأن ترسل الحل الصحيح للمسألة، بل يجب أن تركز على فهم المسألة وكيفية حلها، بدلاً من نسخ الحل من مكان ما على الإنترنت وإرساله، فقط من أجل الحصول على بعض السعادة الكاذبة.
  4. الإستمرارية والتركيز هما أهم أسرار النجاح، لأنك إن لم تحول حل المسائل على موقع leetcode إلى عادة يومية فسوف يكون من الصعب عليك تحسين مستواك البرمجي.أما التركيز فأقصد به عدم التشتت بمحاولة تعلم أكثر من خوارزمية بنفس الوقت أو البدء بإستخدام أكثر من موقع للمسائل البرمجية في آن معاً.

أقرأ أيضاً: نطاق المتغيرات في لغة السي شارب.

حل مسألة (206. Reverse Linked List) على موقع leetcode

يمكن الوصول إلى المسألة على موقع leetcode من هنا.

نص المسألة (Reverse Linked List)

سوف تعطى المؤشر الذي يشير إلى بداية (linked list) والمطلوب منك هو عكسها. وهذا يتضح بالمثال التالي:

Reverse Linked List

الدخل: [1,2,3,4,5]

الخرج: [5,4,3,2,1]

شرح حل مسألة (Reverse Linked List)

أولاً سنقوم بتعريف ثلاث مؤشرات وهي:

  • ListNode*curr = head
  •   ListNode*prev = NULL
  •   ListNode*next = NULL

نلاحظ أننا قمنا بتعريف مؤشرات تشير إلى (linked list)، ووضعنا المؤشر (curr) ليشير إلى (head) والمؤشران الأخران يشيران إلى (NULL).

الفكرة تكمن في ثلاث خطوات بسيطة وهي:

  1. نجعل المؤشر (next) يشير إلى العقدة الثانية (أي التي تلي العقدة الأولى). من خلال التعليمة (next = curr->next).
  2. نقطع الإتصال بين العقدة التي يشير إليها المؤشر (curr) والعقدة التي تليها، ونجعل المؤشر الخاص بها يشير إلى العقدة السابقة لها. من خلال التعليمة (curr->next = prev).
  3. نجعل المؤشر (prev) يشير إلى العقدة التي يشير لها المؤشر (Curr). من خلال التعليمة (prev = curr).
  4. نقدم المؤشر (curr) ليشير إلى العقدة التالية.
  5. نكرر العملية داخل حلقة (while) طالما أن المؤشر(curr) لا يشير إلى (Null).

اذا شعرت أنك لم تفهم شيئاً، فلا بأس لأنني سوف اكتب لك الكود الآن لتطلع عليه، وكما سوف أزودك بفيديو لحل المسألة بلغة جافا.

حل المشكلة (الكود)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
  ListNode*curr = head;
  ListNode*prev = NULL;
  ListNode*next = NULL;

while(curr!= NULL){
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;

}
return prev;

فيديو يشرح طريقة حل المسألة مع الكود بلغة جافا [إنكليزي]

حل مشكلة Reverse Linked List على موقع leetcode

شرح أشمل للمسألة

في حال قرأت الشرح المبسط في الأعلى ونظرت إلى الكود وفكرت به، وأيضاً شاهدت الفيديو في الأعلى ولم تصل إلى فهم طريقة حل المشكلة فهذه الفقرة لك.

أولاً، (linked list) هي عبارة عن مجموعة من العقد المتصلة مع بعضها البعض، وتتألف كل عقدة من جزئين وهما:

  • البيانات.
  • المؤشر، الذي يشير إلى العقدة التالية.

وأما عن طريقة ارتباط العقد مع بعضها البعض، فيتم ذلك عن طريق المؤشرات، حيث كما ذكرت تمتلك كل عقدة مؤشر يشير إلى العقدة التالية.أما مؤشر العقدة الأخيرة فهو يشير إلى (Null).

linked list بنية معطيات خطية تتضمن مجموعة من العقد المتصلة مع بعضها البعض، حيث كل عقدة تحتوي على بيانات وعنوان للعقدة التالية (مخزن في مؤشر).

linked-list

من المهم فهم أنواع بنى المعطيات الأساسية قبل البدء في استخدام موقع leetcode.

حتى نبني (linked list) يجب أن نبدء في مكان ما، لذلك نعطي العنوان الخاص بأول عقدة اسماً خاصاً وهو الرأس (Head). وأيضاً، العقدة الأخيرة يمكن تعريفها لأنة المؤشر الخاص بها يشير لإلى (NULL).

// Linked list implementation in C++

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

// إنشاء عقدة
class Node {
   public:
  int value;
  Node* next;
};

int main() {
  Node* head;
  Node* one = NULL;
  Node* two = NULL;
  Node* three = NULL;

  // تهيئة العقد
  one = new Node();
  two = new Node();
  three = new Node();

  // تمرير القيم
  one->value = 1;
  two->value = 2;
  three->value = 3;

  //ربط العقد معاً
  one->next = two;
  two->next = three;
  three->next = NULL;

  // طباعة القيم المخزنة في العقد
  head = one;
  while (head != NULL) {
    cout << head->value;
    head = head->next;
  }
}

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

الحالة المتوسطةالحالة الأسوء (الأهم)
البحثO(n)O(n)
الإدخالO(1)O(1)
الحذفO(1)O(1)

تعقيد المساحة هو : O(n)

بشكل بسيط، المؤشر هو عبارة عن متغير يقوم بتخزين عنوان الذاكرة الخاصىة بمتغير آخر.

اذا كان لدينا متغير اسمه (X) فأن (&X) سوف يعيد لنا عنوان المتغير (X) في الذاكرة، مثال:

#include <iostream>
using namespace std;

int main()
{
    // تعريف المتغيرات
    int X1 = 10;
    int X2 = 12;
    int X3 = 20;

    // طباعة عنوان المتغير الأول
    cout << "Address of X1:"<< &X1 << endl;

    //طباعة عنوان المتغير الثاني
    cout << "Address of X2: " << &X2 << endl;

    // طباعة عنوان المتغير الثالث
    cout << "Address of X3: " << &X3 << endl;
}
Address of X1:0x16cfe1c
Address of X2: 0x16cfe18
Address of X3: 0x16cfe14

هنا، الرمز (0x) يشير إلى التمثيل في النظام الستة عشري، حيث أن عناوين الذاكرة تكتب بهذا التمثيل.أما الأعداد التي نستخدمها في الحياة العادية فهي من النظام العشري، والذي يستخدم 10 أعداد هي من [0-9].النظام الستة عشري يستخدم الأعداد [0-15].

ملاحظة:

انتبه، ربما تحصل على نتيجة مختلفة عند تنفيذ البرنامج
    int* ponter; // الطريقة الأولى والأفضل
    int *pointer; // الطريقة الثانية 

في المثال أعلاه، عرفنا المؤشر نفسه بطريقتين كلاهما صحيحية.لكن الطريقة الأولى مفضلة أكثر، والمؤشر في مثالنا هذا اسمه (pointer) وهو من النوع (int).أي يخزن عنوان لمتغير من النوع (int).

int* pointer, value;
value = 5; // المتغير

//تمرير قيمة المتغير إلى المؤشر
pointer = &value;

هنا، القيمة (5) مُررت إلى المتغير (Value). وبنفس الوقت، عنوان المتغير (Value) تم تمريره إلى المؤشر (pointer) من خلال التعليمة (pointer = &value).

يمكنك معرفة المزيد عن المؤشرات من هنا.

أهمية حل المسائل على موقع leetcode والمواقع المشابهة

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

بمعنى، أن يتمكن المبرمج من التفكير ببرنامج ما بشكل ذهني، ومن ثم يمتلك القدرة على تحويله إلى كود برمجي يعمل بشكل صحيح وفعال.

بالإضافة لما سبق، استحدام موقع leetcode مفيد من أجل التحضير للمقابلات الخاصة بوظائف المبرمجين والمطورين من مختلف المجالات البرمجية.

بالطبع، ليس من الضروري استخدام موقع leetcode من أجل الحصول على وظيفة في شركة متخصصة في مجال تقنية المعلومات أو البرمجة.لكن، استخدام موقع leetcode من الممكن أن يرفع فرصتك بشكل كبير عزيزي القارئ.

وهكذا نكون قد وصلنا إلى نهاية هذا المقال والذي تحدثنا فيه عن استخدام موقع leetcode بشكل فعال، وكما ذكرنا أهمية الخوارزميات وبنى المعطيات في مساعدت المبرمج على حل مختلف أنواع المسائل البرمجية.

وكما، ذكرنا بالتفصيل كيف يمكن حل مسألة على موقع ليت كود.أيضاً، تحدثنا عن أهم النصائح التي يجب أن تعرفها قبل البدء في استخدام موقع leetcode.

اذا أعجبك المحتوى، لا تنسى أن تتابعني على الفيسبوك (يمكنك القيام بذلك من الصفحة الرئيسية).اذا كان لديك أي سؤال. اسأل في التعليقات وسوف أردك عليك صديقي.

اترك تعليقاً

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