Bài viết này được dịch lại từ bài viết  “đảo ngược chuỗi“ trên Free Code Camp

Đảo ngược chuỗi là một trong những câu hỏi được hỏi nhiều nhất trong các vòng phỏng vấn về JavaScript. Nhà tuyển dụng có thể hỏi bạn viết các cách khác nhau đảo ngược chuỗi, hoặc họ có thể hỏi bạn cách đảo ngược chuỗi mà không sử dụng phương pháp “ tham chiếu dựng sẵn “  hoặc họ có thể hỏi bạn về đảo ngược chuỗi bằng phương pháp đệ quy.

Có tận 10 cách khác nhau để xử lý việc đó, bao gồm việc sử dụng hàm tham chiếu đảo ngược dựng sẵn. Trong khi mà JavaScript không có.

Dưới đây là 3 cách thú vị nhất để giải quyết vấn đề đảo ngược chuỗi trong JavaScript.

Thuật toán như sau

Hãy đảo ngược chuỗi cho trước sau:

Gợi ý: Bạn nên biến chuỗi đó thành mảng trước khi đảo ngược nó

Kết quả phải là 1 chuỗi:

 

function reverseString(str) {
    return str;
}
reverseString("hello");

Các điều kiện đề bài:

  • Đảo ngược chuỗi : “ HELLO “ thành “OLLEH”
  • Đảo ngược chuỗi : “ HOWDY “ thành “ YDWOH”
  • Đảo ngược chuỗi “ Greeting from Earth “ thành “ HTRE MORF SGNITEERG “
  1. Đảo ngược chuỗi với tham chiếu hàm được lập sẵn

Đối với vấn đề, chúng ta sẽ sử dụng 3 phương pháp: String.prototype.split()  ;

Array.prototype.reverse() ; Array.prototype.join() .

  • Phương pháp split () chia nhỏ các phần tử chuỗi thành các mảng.
  • Phương pháp reverse () đảo ngược mảng. Phần tử mảng đầu tiên trở thành phần tử cuối và phần tử cuối thành phần tử đầu
  • Phương pháp Join() để tất cả phần tử của mảng thành một chuỗi
    function reverseString(str) {
        // Step 1. Use the split() method to return a new array
        var splitString = str.split(""); // var splitString = "hello".split("");
        // ["h", "e", "l", "l", "o"]
     
        // Step 2. Use the reverse() method to reverse the new created array
        var reverseArray = splitString.reverse(); // var reverseArray = ["h", "e", "l", "l", "o"].reverse();
        // ["o", "l", "l", "e", "h"]
     
        // Step 3. Use the join() method to join all elements of the array into a string
        var joinArray = reverseArray.join(""); // var joinArray = ["o", "l", "l", "e", "h"].join("");
        // "olleh"
        
        //Step 4. Return the reversed string
        return joinArray; // "olleh"
    }
     
    reverseString("hello");

    2. Đảo ngược mảng với việc làm giảm số vòng lặp

  • function reverseString(str) {
        // Step 1. Create an empty string that will host the new created string
        var newString = "";
     
        // Step 2. Create the FOR loop
        /* The starting point of the loop will be (str.length - 1) which corresponds to the 
           last character of the string, "o"
           As long as i is greater than or equals 0, the loop will go on
           We decrement i after each iteration */
        for (var i = str.length - 1; i >= 0; i--) { 
            newString += str[i]; // or newString = newString + str[i];
        }
        /* Here hello's length equals 5
            For each iteration: i = str.length - 1 and newString = newString + str[i]
            First iteration:    i = 5 - 1 = 4,         newString = "" + "o" = "o"
            Second iteration:   i = 4 - 1 = 3,         newString = "o" + "l" = "ol"
            Third iteration:    i = 3 - 1 = 2,         newString = "ol" + "l" = "oll"
            Fourth iteration:   i = 2 - 1 = 1,         newString = "oll" + "e" = "olle"
            Fifth iteration:    i = 1 - 1 = 0,         newString = "olle" + "h" = "olleh"
        End of the FOR Loop*/
     
        // Step 3. Return the reversed string
        return newString; // "olleh"
    }
     
    reverseString('hello');

    3. Đảo ngược mảng với việc sử dụng hàm đệ quy

Để giải quyết vấn đề này, Chúng ta sử dụng phương pháp: String.prototype.substr() và String.prototype.charAt()

Phương pháp substr() trả về  sau ký tự đầu tiên được chỉ định ở trong chuỗi:

"hello".substr(1); // "ello"

Phương pháp charAt() trả về ký tự đầu tiên chỉ định từ chuỗi

"hello".charAt(0); // "h"
function reverseString(str) {
  if (str === "") // This is the terminal case that will end the recursion
    return "";
  
  else
    return reverseString(str.substr(1)) + str.charAt(0);
/* 
First Part of the recursion method
You need to remember that you won’t have just one call, you’ll have several nested calls
Each call: str === "?"        	                  reverseString(str.subst(1))     + str.charAt(0)
1st call – reverseString("Hello")   will return   reverseString("ello")           + "h"
2nd call – reverseString("ello")    will return   reverseString("llo")            + "e"
3rd call – reverseString("llo")     will return   reverseString("lo")             + "l"
4th call – reverseString("lo")      will return   reverseString("o")              + "l"
5th call – reverseString("o")       will return   reverseString("")               + "o"
Second part of the recursion method
The method hits the if condition and the most highly nested call returns immediately
5th call will return reverseString("") + "o" = "o"
4th call will return reverseString("o") + "l" = "o" + "l"
3rd call will return reverseString("lo") + "l" = "o" + "l" + "l"
2nd call will return reverserString("llo") + "e" = "o" + "l" + "l" + "e"
1st call will return reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h" 
*/
}
reverseString("hello");

Sâu xa của việc sử dụng đệ quy là khiến độ dài của chuỗi là bằng nhau. Giải pháp này không phải là giải pháp tốt nhất và nó sẽ trở nên bị chậm nếu mà chuỗi vô cùng dài và kích thước data vô cùng lớn.

4.Kết luận

Đảo ngược chuỗi ở JavaScript là thuật toán đơn giản mà có thể bị hỏi bởi các nhà tuyển dụng. Bạn nên dành thời gian để giải quyết bài toán này hoặc sử dụng phương pháp đệ quy.