FreeCodeCamp 初級算法題 - 翻轉字符串

原文連接:http://singsing.io/blog/2017/...算法

翻轉字符串 (Reverse a String)

題目連接

問題解釋

  • 這個 function 接收一個字符串參數,返回翻轉後的字符串blog

  • 好比接收的是 "hello",那麼輸出就是 "olleh"遞歸

參考連接

思路提示

  1. 先把字符串分割成爲數組get

  2. 翻轉數組

  3. 把翻轉後的數組合併爲字符串

參考答案

基本答案

function reverseString(str) {
    var strArr = str.split('');
    var reversedArr = strArr.reverse();
    return reversedArr.join('');
}

解釋

  • 第一步就是把傳入的 str 分割,並賦值給 strArr

  • 第二步是把數組翻轉,並賦值給 reversedArr

  • 第三步是返回合併以後的字符

  • 須要注意的是,以上的 .split.join 都不會改變原來的字符串或數組,但 reverse 會改變原來的數組

優化

function reverseString(str) {
    return str.split('').reverse().join('');
}

解釋

  • .split 返回分割後的數組,所以能夠直接調用 .reverse

  • .reverse() 方法返回的是翻轉後的數組,所以能夠直接調用 .join

  • .join 以後就是咱們想要的字符串,直接返回便可

  • 這裏用到了 Method Chaining,也就是方法的鏈式調用。只要你熟悉方法的返回值,就能夠這麼作,好處在於能夠不用建立這麼多變量

中級解法

  • 直接利用字符串方法,而不須要轉換成數組

function reverseString(str) {
    var result = "";
    for (var i = str.length - 1; i >= 0; i--) {
        result += str[i];
    }
    return newString;
}

解釋

  • 首先咱們先建立一個變量,叫 result,用於保存輸出結果

  • 而後,從右邊開始遍歷字符串。值得注意的是,就像數組同樣,字符串同樣能夠經過因此來獲取某一個字符。好比,str[0] 就是獲取第一個字符。再好比,str[-1] 就是獲取最後一個字符

  • 由於是從右邊開始遍歷,那咱們把每次遍歷到的字符直接加到 result 就能夠了

  • 須要注意的是邊界條件的肯定,由於字符串的索引一樣是從 0 開始的,所以遍歷的初始值要設置爲 str.length - 1,結束值爲 0

高級解法

  • 經過字符串方法以及遞歸來翻轉

function reverseString(str) {
    // 設置遞歸終點(彈出條件)
    if (!str) {
        return "";
    }
    else {
        // 遞歸調用
        return reverseString(str.substr(1)) + str.charAt(0);
    }
}

解釋

  • 這種方法,一開始不能理解不要緊。等作到高級算法題,再回來看看應該就能夠理解了

  • 遞歸涉及到兩個因素,遞歸調用以及彈出過程。reverseString(str.substr(1)) 就是遞歸調用,+ str.charAt(0) 就是彈出過程

  • 代碼在執行到 reverseString(str.substr(1)) 的時候,會從新調用 reverseString,並傳入 str.substr(1) 做爲參數。後面的 + str.charAt(0) 暫時不會執行

  • 直到碰見傳入的字符串爲 "",由於有了 "" 返回值,就不會再去調用 reverseString 了。這時候,纔會一步一步地執行 + str.charAt(0),也就是彈出過程

舉個例子:

var str = "abc";

reverseString(str)
  • 執行過程以下:

    • 首先執行 reverseString("abc"),這時候傳入的 str 不爲空,因此執行 else 部分。讀到了 reverseString(str.substr(1)),這時候就是遞歸調用,執行這段代碼,其中 str.substr(1) 爲 "bc"

      • reverseString("bc"),這時候傳入的 str 不爲空,因此執行 reverseString(str.substr(1)),其中 str.substr(1) 爲 "c"

        • reverseString("c"),這時候傳入的 str 依舊不爲空,因此執行 reverseString(str.substr(1)),其中 str.substr(1) 爲 ""

          • reverseString(""),終於,傳入的 str 爲空,這時候返回 ""

        • 回到 reverseString("c") 這一步,剛纔的返回值是 "",此時的 str.charAt(0)"c",那麼這一步的返回值是 "c"

      • 回到 reverseString("bc"),剛纔的返回值是 "c",此時的 str.charAt(0)"b",那麼這一步的返回值是 "cb"

    • 回到 reverseString("abc"),剛纔的返回值是 "cb",此時的 str.charAt(0)"a",那麼這一步的返回值是 "cba"

至此,咱們獲得了最終結果,"cba"

相關文章
相關標籤/搜索