11 KiB
title | localeTitle |
---|---|
Palindrome Checker | Palindrome المدقق |
تذكر استخدام Read-Search-Ask
إذا واجهتك مشكلة. حاول إقران البرنامج واكتب الكود الخاص بك
شرح المشكلة:
هدفنا لحل هذه المشكلة هو ترتيب السلسلة التي يتم تمريرها والتحقق مما إذا كانت في الواقع متناظرة.
- إذا لم تكن متأكداً مما هو متناظر ، فكلمة أو عبارة هي عندما تنقض تعويذ نفس الشيء للأمام أو للخلف. مثال بسيط هو
mom
، عند عكس الحروف ، فإنها تنطق نفس الشيء! مثال آخر لالمتطابق هوrace car
. عندما نأخذ أي شيء ليس حرفًا ، يصبحracecar
هو نفس الهجاء للأمام أو إلى الوراء!
بمجرد أن نحدد ما إذا كانت متناظرة أو لا نريد إرجاعها إما true
أو false
استنادًا إلى النتائج التي توصلنا إليها.
روابط ذات صلة
تلميح: 1
يمكن استخدام التعبيرات العادية ، RegEx
، لإزالة الأحرف غير المرغوب فيها من السلسلة.
حاول أن تحل المشكلة الآن
تلميح: 2
و Array.prototype.split
و Array.prototype.join
الأساليب يمكن أن تكون ذات فائدة هنا. For
while
الحلقات هي بديل آخر ، أو لماذا لا حتى map
!
حاول أن تحل المشكلة الآن
تلميح: 3
يمكن استخدام String.prototype.toLowerCase
لإنشاء سلسلة صغيرة.
حاول أن تحل المشكلة الآن
تنبيه المفسد!
الحل في المستقبل!
الحل الأساسي للكود:
function palindrome(str) { return str.replace(/[\W_]/g, '').toLowerCase() === str.replace(/[\W_]/g, '').toLowerCase().split('').reverse().join(''); }
شرح الشفرة:
-
نبدأ باستخدام التعبيرات العادية لاستبدال أي مساحة بيضاء أو أحرف غير أبجدية رقمية بدون أي شيء (أو
null
) ، والتي تزيلها بشكل أساسي من السلسلة. -
نحن المقبل سلسلة ل
.toLowerCase()
لإزالة أي حروف لA
هو حرف مختلفة منa
. لم تطالبنا المشكلة بالقلق من التأكد من أن حالة الأحرف متطابقة ، فقط التهجئة. -
خطوتنا التالية هي أن نأخذ السلسلة و
.split()
،.reverse()
و ، وأخيرا.join()
مرة أخرى معا. -
الخطوة الأخيرة هي التحقق من أن السلسلة هي نفسها إلى الأمام والخلف وإرجاع النتيجة!
روابط ذات صلة
حل الشفرة المتوسطة:
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; }
شرح الشفرة:
-
نبدأ باستخدام نفس الأساليب لاستبدال الحروف التي لا نريدها في السلسلة باستخدام تعبيرات
RegEx
العادية ، ثم جعل السلسلة الخاصة بنا صغيرة. -
بعد ذلك قمنا بإعداد حلقة
for
ونعلن عن فهرسi
لتتبع الحلقة. وضعناها لدينا تسلسل هروب إلى عندماi
أكبر من طول السلسلة مقسوما على اثنين، الذي يحكي حلقة لوقف بعد منتصف الطريق من السلسلة. وأخيرًا ،i
على الزيادة بعد كل حلقة. -
داخل كل حلقة نريد التحقق من أن الحرف في العنصر
[i]
يساوي الحرف في طول السلسلة ناقص i ،[str.length - i]
. في كل حلقة ، يتحرك العنصر الذي يتم فحصه على جانبي السلسلة بالقرب من المركز حتى نتحقق من جميع الأحرف. إذا لم تتطابق الحروف في أي لحظة ، فإننا نرجعfalse
. إذا اكتملت الحلقة بنجاح ، فهذا يعني أن لدينا متناظرًا ، وبالتالي نعود إلىtrue
!
روابط ذات صلة
- رجإكس
الحل المتقدم للكود (الأكثر أداء):
` //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
}
`
شرح الشفرة:
-
أعطيت هذه المشكلة في مقابلة (المفسد: لم أكن قد استأجرت ) سرعان ما وصلت إلى الحل الأساسي ، وأخبرني القائم بالمقابلة أن أجعله أفضل. سيستغرق الأمر خوارزمية طويلة للغاية إذا اجتاز الكتاب المقدس كسلسلة. كان يريد أن يكون لحظة.
-
تعمل الحلول البسيطة بشكل سيء جدًا على السلاسل الطويلة لأنها تعمل على السلسلة بأكملها عدة مرات (toLowerCase () ، الاستبدال () ، split () ، reverse () ، join ()) قبل مقارنة السلسلة بأكملها مرتين.
-
جمال هذا الحل هو أنه لا يحتاج أبدا إلى قراءة السلسلة بأكملها ، ولو مرة واحدة ، لمعرفة أنها ليست متناظرة. لماذا تقرأ السلسلة الكاملة إذا كنت تستطيع أن تقول أنها ليست مجرد متناظرة بمجرد النظر إلى خطابين؟
-
يستخدم حلقة while بدلاً من حلقة for كأفضل ممارسة - لأننا نستخدم متغيرين ، أحدهما يبدأ من بداية السلسلة ، ويبدأ الآخر في نهاية السلسلة.
روابط ذات صلة
ملاحظات للمساهمات:
- لا تقم بإضافة حلول مشابهة لأي حلول موجودة. إذا كنت تعتقد أنها مشابهة ولكن أفضل ، فحاول دمج (أو استبدال) الحل المشابه الموجود.
- أضف شرحًا لحلك.
- تصنيف الحل في واحدة من الفئات التالية - الأساسي والمتوسط والمتقدم .
- الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة أي محتويات رئيسية ذات صلة . ( لا تزيل أي أسماء مستخدمين حالية )
نرى
Wiki Challenge Solution Template
كمرجع.