วันนี้ฉันกำลังฝึกคำถามเกี่ยวกับ FreeCodecamp และฉันพบคำถามเกี่ยวกับการผกผันของสตริง การย้อนกลับสตริงเป็นหนึ่งในคำถามสัมภาษณ์ทั่วไปใน JavaScript บางทีผู้สัมภาษณ์จะให้สตริง "สวัสดีคำ!" ซึ่งจะช่วยให้คุณเปลี่ยนเป็น "! Drow Olleh" ผ่าน JavaScript
ฉันยังเป็นมือใหม่ ฉันผ่านการทดสอบโดยใช้ความรู้ที่เกี่ยวข้องกับอาร์เรย์ที่ฉันได้เรียนรู้มาก่อนและเคล็ดลับเกี่ยวกับคำถาม ต่อมาฉันสงสัยว่ามีวิธีอื่นในการแก้ปัญหานี้หรือไม่? หลังจากค้นหายังมีอีกหลายวิธี นี่คือวิธีการเหล่านี้สำหรับการใช้งานในภายหลัง
สิ่งที่ต้องทำ
สิ่งที่เราอยากทำ:
ก่อนที่จะแสดงสตริงที่ให้ไว้ในย้อนกลับก่อนที่สตริงย้อนกลับคุณจะต้องแปลงสตริงเป็นอาร์เรย์และผลลัพธ์สุดท้ายยังคงเป็นสตริง
จากนั้นมาดูกันว่าวิธีการใดบ้างที่สามารถบรรลุข้อกำหนดข้างต้นได้
ใช้ฟังก์ชั่นในตัว
ในแบบฝึกหัดเราจะได้รับแจ้งว่าเราสามารถใช้สามวิธีในการแสดงสตริงที่ย้อนกลับได้สำเร็จ:
string.prototype.split () array.prototype.reverse () array.prototype.join ()
เพียงแค่ผ่านมันสั้น ๆ :
แยก () เมธอดแยกแต่ละอักขระของวัตถุสตริงและปฏิบัติต่อแต่ละสตริงเป็นแต่ละองค์ประกอบของอาร์เรย์, ย้อนกลับ () วิธีการเปลี่ยนอาร์เรย์จัดเรียงองค์ประกอบในอาร์เรย์ตามลำดับย้อนกลับองค์ประกอบอาร์เรย์แรกจะกลายเป็นสุดท้าย
ลองมาดูตัวอย่าง:
ฟังก์ชั่น reversestring (str) {// ขั้นตอนแรกคือการใช้วิธีแยก () เพื่อส่งคืนอาร์เรย์ใหม่ // var splitstring = "hello" .split (""); var splitstring = str.split (""); // แยกสตริง // ส่งคืนอาร์เรย์ใหม่ ["h", "e", "l", "l", "l", "o"] // ขั้นตอนที่สองคือการใช้วิธีการย้อนกลับ () เพื่อสร้างอาร์เรย์ใหม่ // var reversearray = ["h", "e", "l", "l", "o" var reverseArray = splitString.Reverse (); // องค์ประกอบอาร์เรย์ดั้งเดิมจะถูกย้อนกลับตามลำดับ ["o", "l", "l", "e", "h"] // ขั้นตอนที่สามคือการใช้วิธีการเข้าร่วม () เพื่อเข้าร่วมองค์ประกอบแต่ละอันของอาร์เรย์และรวมเข้ากับสตริงใหม่ // VAR JoinArray = ReverseArray.Join (""); // "olleh" // ขั้นตอนที่สี่คือการส่งคืนสตริงใหม่ที่กลับรายการ Return JoinArray; // "olleh"} reversestring ("สวัสดี"); // => ollehทำให้วิธีการข้างต้นง่ายขึ้นและสามารถเขียนได้เช่นนี้:
ฟังก์ชั่น reversestring (str) {return str.split (""). reverse (). เข้าร่วม ("");} reversestring ("สวัสดี"); // => ollehพลิกผันสตริงโดยใช้การสำรวจแบบวนซ้ำที่ลดลง
วิธีนี้ใช้ A for loop เพื่อทำการสำรวจการเคลื่อนที่ที่ลดลงไปยังสตริงต้นฉบับจากนั้นทำการวัดสตริงแบบสำรวจลงในสตริงใหม่อีกครั้ง:
ฟังก์ชั่น reversestring (str) {// ขั้นตอนที่ 1: สร้างสตริงว่างเพื่อจัดเก็บสตริงที่สร้างขึ้นใหม่ var newstring = ""; // ขั้นตอนที่ 2: ใช้ For Loop // Loop เริ่มลดการสำรวจจาก str.length-1 จนกว่าฉันจะสูงกว่าหรือเท่ากับ 0, ลูปจะดำเนินการต่อ // str.length-1 สอดคล้องกับอักขระสุดท้ายของสตริง o สำหรับ (var i = str.length-1; i> = 0; // หรือ newstring = newstring + str [i]; } // ขั้นตอนที่ 3: ส่งคืน String return returntring; } reversestring ('hello'); // => // "olleh"ดูง่ายๆเกี่ยวกับกระบวนการของการสำรวจสตริง สมมติว่าคุณต้องกลับสตริง "สวัสดี" กระบวนการเดินทางทั้งหมดแสดงในตารางต่อไปนี้:
i ที่สอดคล้องกัน อันที่จริงแล้ว for วนรอบด้านบนสามารถถูกแทนที่ด้วยการวน while :
ฟังก์ชั่นย้อนกลับ (str) {var newstring = ''; var i = str.length; ในขณะที่ (i> 0) {newString += str.substring (i - 1, i); ฉัน--; } return newstring;} 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) {ถ้า (str === "") {return ""; } else {return reversestring (str.substr (1)) + str.charat (0); }} การย้อนกลับ ("สวัสดี"); // => ollehส่วนแรกของวิธีการเรียกซ้ำ คุณต้องจำไว้ว่าคุณจะไม่เรียกมันเพียงครั้งเดียวคุณจะมีสายซ้อนกันหลายสาย
ส่วนที่ 2 วิธีการเรียกซ้ำ
วิธีการข้างต้นสามารถปรับปรุงเพิ่มเติมและเปลี่ยนเป็นตัวดำเนินการไตร่ตรอง
ฟังก์ชั่น reversestring (str) {return (str === '')? '': การย้อนกลับ (str.substr (1)) + str.charat (0);} reversestring ("สวัสดี"); // => ollehนอกจากนี้ยังสามารถเปลี่ยนเป็นวิธีนี้ได้
ฟังก์ชั่น reversestring (str) {return str && reversestring (str.substr (1)) + str [0];} reversestring ("สวัสดี"); // => 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 ขั้นพื้นฐาน คุณสามารถใช้วิธีการข้างต้นเพื่อแก้ปัญหานี้หรือแม้แต่ใช้โซลูชันที่ซับซ้อนมากขึ้น หากคุณมีวิธีที่ดีกว่าโปรดเพิ่มในความคิดเห็นด้านล่างและแบ่งปันกับเรา