freeCodeCamp/guide/arabic/certifications/coding-interview-prep/algorithms/no-repeats-please/index.md

11 KiB

title localeTitle
No Repeats Please لا يتكرر من فضلك

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

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

تتطلب هذه المهمة أن نرجع عدد التبديلات الإجمالية للسلسلة المقدمة التي لا تحتوي على أحرف متتالية متكررة. من المفترض أن تكون كل الحروف في السلسلة المقدمة فريدة. على سبيل المثال ، يجب أن يعود aab 2 لأنه يحتوي على 6 تباديل كلي ( aab ، aab ، aba ، aba ، baa ، baa ) ، ولكن 2 منهم فقط ( aba و aba ) ليس لديهم نفس الحرف (في هذه الحالة a ) التكرار.

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

الأساليب المحتملة المستخدمة كحل

طريقة متكررة

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

  1. سلسلة جديدة (أو مصفوفة أحرف) قيد الإنشاء.
  2. موضع في السلسلة الجديدة سيتم ملؤه بعد ذلك.
  3. لم يتم بعد استخدام فكرة عن الأحرف (المواضع الأكثر تحديدًا) من السلسلة الأصلية.

سيبدو الرمز الزائف شيئًا كالتالي:

var str = ???; permAlone(current position in original string, characters used already in original string, created string) { if (current string is finished) { print current string; } else { for (var i = 0; i < str.length; i++) { if (str[i] has not been used) { put str[i] into the current position of new string; mark str[i] as used; permAlone(current position in original string, characters used already in original string, created string); remove str[i] as used because another branch in the tree for i + 1 will likely use it; } } } } permAlone(0, nothing used yet, empty new string (or array the same size as str));

طريقة أخرى للتفكير في هذه المشكلة هي البدء من مساحة فارغة. قدم أول حرف إلى الفضاء. ستحتوي هذه المساحة الآن على التقسيم الفرعي الأول. فيما يلي رسم بياني يوضح الفكرة:

رسم بياني

طريقة غير متكررة

`// An approach to introduce a new character to a permutation var ch = '?'; var source = ['?', '?', '?']; // Current sub-permutation var temp, dest = [];

for (var i = 0; i <= source.length; ++i) { temp = source.slice(0); // Copy the array temp.splice(i, 0, ch); // Insert the new character dest.push(temp); // Store the new sub-permutation } `

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

طريقة لتصور هذا هو النظر في الشجرة التي تبدأ بالحرف الأول من السلسلة:

شجرة التقابل

روابط ذات صلة

:speech_balloon: تلميح: 1

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

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

:speech_balloon: تلميح: 2

  • بمجرد الحصول على القائمة ، قم فقط بإنشاء تعبير عادي لالتقاط الأحرف المتكررة.

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

:speech_balloon: تلميح: 3

  • ستحتاج إلى الحصول على التباديل كمصفوفة من السلاسل المترابطة بدلاً من الأحرف المنفصلة.

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

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

علامة تحذير

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

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

`function permAlone(str) {

// Create a regex to match repeated consecutive characters. var regex = /(.)\1+/g;

// Split the string into an array of characters. var arr = str.split(''); var permutations = ]; var tmp;

// Return 0 if str contains same character. if (str.match(regex) !== null && str.match(regex)[0] === str) return 0;

// Function to swap variables' content. function swap(index1, index2) { tmp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tmp; }

// Generate arrays of permutations using the algorithm. function generate(int) { if (int === 1) { // Make sure to join the characters as we create the permutation arrays permutations.push(arr.join('')); } else { for (var i = 0; i != int; ++i) { generate(int - 1); swap(int % 2 ? 0 : i, int - 1); } } }

generate(arr.length);

// Filter the array of repeated permutations. var filtered = permutations.filter(function(string) { return !string.match(regex); });

// Return how many have no repetitions. return filtered.length; }

// Test here. permAlone('aab'); `

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

شرح الشفرة:

  • يحتوي regex على التعبير العادي لمطابقة الأحرف المتتالية المتكررة.
  • يتم تقسيم str السلسلة إلى صفيف من الأحرف ، arr .
  • يتم إرجاع 0 إذا كان str يحتوي على نفس الأحرف.
  • يتم استخدام swap() الدالة swap() لغرض تبديل محتويات محتويات اثنين من المتغير.
  • تستخدم الكتلة التالية من التعليمات البرمجية خوارزمية كومة الذاكرة المؤقتة لإنشاء صفائف من التباديل في التباديل .
  • وتصفيتها مرشحات التباديل متغير لتشمل التباديل غير المتكررة فقط.
  • يُرجع filtered.length عدد التباديل الإجمالي للسلسلة المقدمة التي لا تحتوي على أحرف متتالية متكررة.

روابط ذات صلة

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

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

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