اليوم كنت أمارس السؤال على FreeCodecamp ، وواجهت سؤالًا حول انعكاس السلسلة. يعد عكس السلسلة أحد أسئلة المقابلة الشائعة في JavaScript. ربما سيعطيك القائم بإجراء المقابلة سلسلة "Hello Word!" ، والتي ستسمح لك بتحويلها إلى "! Drow Olleh" من خلال JavaScript.
أنا أيضا مبتدئ. لقد اجتازت الاختبار باستخدام المعرفة المتعلقة بالمصفوفات التي تعلمتها من قبل والنصائح حول الأسئلة. تساءلت لاحقًا ، هل هناك أي طريقة أخرى لحل هذه المشكلة؟ بعد البحث ، لا يزال هناك العديد من الطرق. فيما يلي بعض هذه الطرق للاستخدام لاحقًا.
أشياء يجب القيام بها
الأشياء التي نريد القيام بها:
قبل عرض السلسلة المقدمة في العكس قبل السلسلة العكسية ، تحتاج إلى تحويل السلسلة إلى صفيف ولا تزال النتيجة النهائية عبارة عن سلسلة.
بعد ذلك ، دعونا نلقي نظرة على الأساليب التي يمكن أن تحقق المتطلبات المذكورة أعلاه.
باستخدام وظائف مدمجة
في التدريبات ، يُطلب منا أن نستطيع استخدام ثلاث طرق لعرض سلسلة بنجاح في الاتجاه المعاكس:
string.prototype.split () array.prototype.reverse () array.prototype.join ()
فقط اذهب من خلاله لفترة وجيزة:
تقسيم () طريقة تقسيم كل حرف من كائن سلسلة ، ويعامل كل سلسلة ككل كل عنصر من عناصر الصفيف ، يعكس () طريقة لتغيير المصفوفة ، وترتيب العناصر في الصفيف بترتيب عكسي ، ويصبح عنصر الصفيف الأول هو الأخير ، ويصبح آخر طريقة الوصلة () تربط جميع العناصر في المصفوفة إلى سلسلة
دعونا نلقي نظرة على مثال:
الوظيفة ReverseString (str) {// الخطوة الأولى هي استخدام طريقة split () لإرجاع مجموعة جديدة // var splitstring = "hello" .split ("") ؛ var splitstring = str.split ("") ؛ // قم بتقسيم السلسلة // إرجاع مجموعة جديدة ["H" ، "E" ، "L" ، "L" ، "L" ، "O"] هي الخطوة الثانية هي استخدام طريقة عكس () لإنشاء صفيف جديد // var reversearray = ["H" ، "e" ، "l" ، "o" ، "o"] var reversearray = splitstring.reverse () ؛ // يتم عكس عناصر الصفيف الأصلية بالتسلسل ["O" ، "L" ، "L" ، "E" ، "H"] // الخطوة الثالثة هي استخدام طريقة Join () للانضمام إلى كل عنصر من عناصر الصفيف ودمجها في سلسلة جديدة // var joinarray = ["o" ، "l" ، "l" ، "e" ، "h"] var joinarray = ReberSearRay.join ("") ؛ // "olleh" // الخطوة الرابعة هي إعادة سلسلة جديدة يتم عكسها. عودة JoinArray ؛ // "olleh"} ReverseString ("Hello") ؛ // => ollehتبسيط الطريقة أعلاه ويمكن كتابتها مثل هذا:
وظيفة الانعكاس (str) {return str.split (""). revers (). // => ollehانقلب السلسلة باستخدام اجتياز حلقة متناقص
تستخدم هذه الطريقة A for loop لإجراء اجتياز تناقص للسلسلة الأصلية ، ثم إعادة تحريك السلسلة التي تم اجتيازها إلى سلسلة جديدة:
الوظيفة ReverseString (str) {// الخطوة 1: إنشاء سلسلة فارغة لتخزين السلسلة التي تم إنشاؤها حديثًا newstring = "" ؛ // الخطوة 2: استخدم الحلقة لـ for // تبدأ الحلقة في تقليل اجتياز str.length-1 حتى تكون أكبر من أو تساوي 0 ، ستستمر الحلقة // str.length-1 مع الحرف الأخير من السلسلة O لـ (var i = str.length-1 ؛ i> = 0 ؛ i-) // أو newstring = newstring + str [i] ؛ } // الخطوة 3: إرجاع سلسلة الأخبار الإرجاع العكسية ؛ } ReverseString ('hello') ؛ // => // "olleh"نظرة بسيطة على عملية اجتياز السلسلة. لنفترض أنك بحاجة إلى قلب السلسلة "Hello". يتم عرض عملية التجوال بأكملها في الجدول التالي:
i في الواقع ، يمكن أيضًا استبدال حلقة for Above بحلقة while :
وظيفة الانعكاس (str) {var newstring = '' ؛ var i = str.length ؛ بينما (i> 0) {newstring += str.substring (i - 1 ، i) ؛ أنا--؛ } إرجاع تسجيل الأخبار ؛} ReverseString ("Hello") ؛ // => olleh طريقة substring() في حلقة while . يقوم substring() بإرجاع سلسلة فرعية بين فهسين من السلسلة (أو إلى نهاية السلسلة).
تنفيذ انعكاس السلسلة باستخدام العودية
يمكن أيضًا عكس سلسلة باستخدام أساليب String.prototype.substr() و String.prototype.charAt() .
تُرجع طريقة substr() سلسلة فرعية في السلسلة بدءًا من الموضع المحدد إلى الطول المحدد. على سبيل المثال:
var str = "abcdefghij" ؛ console.log ("(1،2):" + str.substr (1،2)) ؛ // (1،2): bcdefghijconsole.log ("(-3،2):" + str.substr (-3،2)) ؛ // (-3،2): hiconsole.log ("(-3):" + str.substr (-3)) ؛ // (-3): hijconsole.log ("(1):" + str.substr (1)) ؛ // (1): bcdefghijconsole.log ("(-20 ، 2):" + str.substr (-20 ، 2)) ؛ // (-20 ، 2): abconsole.log ("(20 ، 2):" + str.substr (20 ، 2)) ؛ // (20 ، 2): تقوم طريقة charAt() بإرجاع الحرف في الموضع المحدد في السلسلة. يتم فهرسة الأحرف الموجودة في السلسلة من اليسار إلى اليمين ، تحتوي الحرف الأول على قيمة فهرس من 0 ، ويحتوي الحرف الأخير (على افتراض أن الحرف في سلسلة stringName ) يحتوي على قيمة فهرس لـ stringName.length - 1 . إذا كانت قيمة index المحددة خارج هذا النطاق ، فسيتم إرجاع سلسلة فارغة.
var anystring = "Brave New World" ؛ console.log ("الحرف في الفهرس 0 هو" + anystring.charat (0) + "'") ؛ // => الحرف في الفهرس 0 هو 'b'console.log ("الحرف في الفهرس 1 هو" + anystring.charat (1) + "'") ؛ // => الحرف في الفهرس 1 هو 'r'console.log ("الحرف في الفهرس 2 هو" + anystring.charat (2) + "'") ؛ // => الحرف في الفهرس 2 هو 'a'console.log ("الحرف في الفهرس 3 هو" + anystring.charat (3) + "'") ؛ // => الحرف في الفهرس 3 هو 'v'console.log ("الحرف في الفهرس 4 هو" + anystring.charat (4) + "'") ؛ // => الحرف في الفهرس 4 هو 'e'console.log ("الحرف في الفهرس 999 هو" + anystring.charat (999) + "'") ؛ // => الحرف في الفهرس 999 هو ""مجتمعة ، يمكننا القيام بذلك لتنفيذ انعكاس السلسلة:
وظيفة الانعكاس (str) {if (str === "") {return "" ؛ } آخر {return reversestring (str.substr (1)) + str.charat (0) ؛ }} ReverseString ("Hello") ؛ // => ollehالجزء الأول من الطريقة العودية. عليك أن تتذكر أنك لن تتصل به مرة واحدة فقط ، سيكون لديك العديد من المكالمات المتداخلة.
الجزء 2 طريقة العودية.
يمكن تحسين الطريقة أعلاه وتغييرها إلى مشغل ثلاثي
وظيفة الانعكاس (str) {return (str === '')؟ '': ReverseString (str.substr (1)) + str.charat (0) ؛} ReverseString ("Hello") ؛ // => ollehيمكن أيضًا تغييره إلى هذه الطريقة
الوظيفة ReverseString (str) {return str && reversestring (str.substr (1)) + str [0] ؛} resperstring ("hello") ؛ // => ollehطرق أخرى
بالإضافة إلى الطرق المذكورة أعلاه ، هناك بالفعل بعض الطرق الأخرى:
الطريقة 1 رمز كود النسخ هي كما يلي: function reverseString (str) { var newString = []; for (var i = str.length - 1, j = 0; i >= 0; i--, j++) { newString[j] = str[i]; } return newString.join('');}reverseString("hello"); // => olleh 2 هو كما يلي: function reverseString (str) { for (var i = str.length - 1, newString = ''; i >= 0; newString += str[i--] ) { } return newString;}reverseString("hello"); // => olleh هو كما يلي: function reverseString (str) { function rev(str, len, newString) { return (len === 0) ? newString : rev(str, --len, (newString += str[len])); } return rev(str, str.length, '');}reverseString("hello"); // =>olleh هو كما يلي: function reverseString (str) { str = str.split(''); var len = str.length, halfIndex = Math.floor(len / 2) - 1, newString; for (var i = 0; i <= halfIndex; i++) { newString = str[len - i - 1]; str[len - i - 1] = str[i]; str[i] = newString; } return str.join('');}reverseString("hello"); // => olleh هي كما يلي: function reverseString (str) { if (str.length < 2) { return str; } var halfIndex = Math.ceil(str.length / 2); return reverseString(str.substr(halfIndex)) + reverseString(str.substr(0, halfIndex));}reverseString("hello"); // =>olleh هو كما يلي: function reverseString(str) { return [].reduceRight.call(str, function(prev, curr) { return prev + curr; }, '');}reverseString("hello"); // =>olleh es6
في ES6 ، يمكن أن يكون أبسط ، مثل:
[...str].reverse().join('');
أو [...str].reduceRight( (prev, curr) => prev + curr );
أو:
const reverse = str => str && reverse(str.substr(1)) + str[0];
انعكاس السلسلة هو خوارزمية صغيرة وبسيطة ، كما ذكرنا سابقًا ، وغالبًا ما يتم استخدامه لمقابلة JavaScript الأساسية. يمكنك استخدام الطرق المذكورة أعلاه لحل هذه المشكلة ، أو حتى استخدام حلول أكثر تعقيدًا. إذا كان لديك طريقة أفضل ، فيرجى إضافتها في التعليقات أدناه ومشاركتها معنا.