freeCodeCamp/guide/arabic/certifications/javascript-algorithms-and-d.../javascript-algorithms-and-d.../palindrome-checker/index.md

11 KiB

title localeTitle
Palindrome Checker Palindrome المدقق

:triangular_flag_on_post: تذكر استخدام Read-Search-Ask إذا واجهتك مشكلة. حاول إقران البرنامج :busts_in_silhouette: واكتب الكود الخاص بك :pencil:

:checkered_flag: شرح المشكلة:

هدفنا لحل هذه المشكلة هو ترتيب السلسلة التي يتم تمريرها والتحقق مما إذا كانت في الواقع متناظرة.

  • إذا لم تكن متأكداً مما هو متناظر ، فكلمة أو عبارة هي عندما تنقض تعويذ نفس الشيء للأمام أو للخلف. مثال بسيط هو mom ، عند عكس الحروف ، فإنها تنطق نفس الشيء! مثال آخر لالمتطابق هو race car . عندما نأخذ أي شيء ليس حرفًا ، يصبح racecar هو نفس الهجاء للأمام أو إلى الوراء!

بمجرد أن نحدد ما إذا كانت متناظرة أو لا نريد إرجاعها إما true أو false استنادًا إلى النتائج التي توصلنا إليها.

روابط ذات صلة

:speech_balloon: تلميح: 1

يمكن استخدام التعبيرات العادية ، RegEx ، لإزالة الأحرف غير المرغوب فيها من السلسلة.

حاول أن تحل المشكلة الآن

:speech_balloon: تلميح: 2

و Array.prototype.split و Array.prototype.join الأساليب يمكن أن تكون ذات فائدة هنا. For while الحلقات هي بديل آخر ، أو لماذا لا حتى map !

حاول أن تحل المشكلة الآن

:speech_balloon: تلميح: 3

يمكن استخدام String.prototype.toLowerCase لإنشاء سلسلة صغيرة.

حاول أن تحل المشكلة الآن

تنبيه المفسد!

علامة تحذير

الحل في المستقبل!

:beginner: الحل الأساسي للكود:

function palindrome(str) { return str.replace(/[\W_]/g, '').toLowerCase() === str.replace(/[\W_]/g, '').toLowerCase().split('').reverse().join(''); }

:rocket: تشغيل الكود

شرح الشفرة:

  • نبدأ باستخدام التعبيرات العادية لاستبدال أي مساحة بيضاء أو أحرف غير أبجدية رقمية بدون أي شيء (أو null ) ، والتي تزيلها بشكل أساسي من السلسلة.

  • نحن المقبل سلسلة ل .toLowerCase() لإزالة أي حروف ل A هو حرف مختلفة من a . لم تطالبنا المشكلة بالقلق من التأكد من أن حالة الأحرف متطابقة ، فقط التهجئة.

  • خطوتنا التالية هي أن نأخذ السلسلة و .split() ، .reverse() و ، وأخيرا .join() مرة أخرى معا.

  • الخطوة الأخيرة هي التحقق من أن السلسلة هي نفسها إلى الأمام والخلف وإرجاع النتيجة!

روابط ذات صلة

:sunflower: حل الشفرة المتوسطة:

function palindrome(str) { str = str.toLowerCase().replace(/[\W_]/g, ''); for(var i = 0, len = str.length - 1; i < len/2; i++) { if(str[i] !== str[len-i]) { return false; } } return true; }

:rocket: تشغيل الكود

شرح الشفرة:

  • نبدأ باستخدام نفس الأساليب لاستبدال الحروف التي لا نريدها في السلسلة باستخدام تعبيرات RegEx العادية ، ثم جعل السلسلة الخاصة بنا صغيرة.

  • بعد ذلك قمنا بإعداد حلقة for ونعلن عن فهرس i لتتبع الحلقة. وضعناها لدينا تسلسل هروب إلى عندما i أكبر من طول السلسلة مقسوما على اثنين، الذي يحكي حلقة لوقف بعد منتصف الطريق من السلسلة. وأخيرًا ، i على الزيادة بعد كل حلقة.

  • داخل كل حلقة نريد التحقق من أن الحرف في العنصر [i] يساوي الحرف في طول السلسلة ناقص i ، [str.length - i] . في كل حلقة ، يتحرك العنصر الذي يتم فحصه على جانبي السلسلة بالقرب من المركز حتى نتحقق من جميع الأحرف. إذا لم تتطابق الحروف في أي لحظة ، فإننا نرجع false . إذا اكتملت الحلقة بنجاح ، فهذا يعني أن لدينا متناظرًا ، وبالتالي نعود إلى true !

روابط ذات صلة

  • رجإكس

:rotating_light: الحل المتقدم للكود (الأكثر أداء):

` //this solution performs at minimum 7x better, at maximum infinitely better. //read the explanation for the reason why. I just failed this in an interview. function palindrome(str) { //assign a front and a back pointer let front = 0 let back = str.length - 1

  //back and front pointers won't always meet in the middle, so use (back > front) 
  while (back > front) { 
    //increments front pointer if current character doesn't meet criteria 
    if ( str[front].match(/[\W_]/) ) { 
      front++ 
      continue 
    } 
    //decrements back pointer if current character doesn't meet criteria 
    if ( str[back].match(/[\W_]/) ) { 
      back-- 
      continue 
    } 
    //finally does the comparison on the current character 
    if ( str[front].toLowerCase() !== str[back].toLowerCase() ) return false 
    front++ 
    back-- 
  } 

  //if the whole string has been compared without returning false, it's a palindrome! 
  return true 

} 

`

:rocket: تشغيل الكود

شرح الشفرة:

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

  • تعمل الحلول البسيطة بشكل سيء جدًا على السلاسل الطويلة لأنها تعمل على السلسلة بأكملها عدة مرات (toLowerCase () ، الاستبدال () ، split () ، reverse () ، join ()) قبل مقارنة السلسلة بأكملها مرتين.

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

  • يستخدم حلقة while بدلاً من حلقة for كأفضل ممارسة - لأننا نستخدم متغيرين ، أحدهما يبدأ من بداية السلسلة ، ويبدأ الآخر في نهاية السلسلة.

روابط ذات صلة

:clipboard: ملاحظات للمساهمات:

  • :warning: لا تقم بإضافة حلول مشابهة لأي حلول موجودة. إذا كنت تعتقد أنها مشابهة ولكن أفضل ، فحاول دمج (أو استبدال) الحل المشابه الموجود.
  • أضف شرحًا لحلك.
  • تصنيف الحل في واحدة من الفئات التالية - الأساسي والمتوسط والمتقدم . :traffic_light:
  • الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة أي محتويات رئيسية ذات صلة . ( :warning: لا تزيل أي أسماء مستخدمين حالية )

نرى :point_right: Wiki Challenge Solution Template كمرجع.