FreeCodeCamp 初級算法題 - 翻轉(zhuǎn)字符串

原文鏈接:http://singsing.io/blog/2017/03/17/fcc-basic-reverse-a-string/

翻轉(zhuǎn)字符串 (Reverse a String)

題目鏈接

問題解釋

  • 這個 function 接收一個字符串參數(shù),返回翻轉(zhuǎn)后的字符串
  • 比如接收的是 "hello",那么輸出就是 "olleh"

參考鏈接

思路提示

  1. 先把字符串分割成為數(shù)組
  2. 翻轉(zhuǎn)數(shù)組
  3. 把翻轉(zhuǎn)后的數(shù)組合并為字符串

參考答案

基本答案

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

解釋

  • 第一步就是把傳入的 str 分割,并賦值給 strArr
  • 第二步是把數(shù)組翻轉(zhuǎn),并賦值給 reversedArr
  • 第三步是返回合并之后的字符
  • 需要注意的是,以上的 .split.join 都不會改變原來的字符串或數(shù)組,但 reverse 會改變原來的數(shù)組

優(yōu)化

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

解釋

  • .split 返回分割后的數(shù)組,因此可以直接調(diào)用 .reverse
  • .reverse() 方法返回的是翻轉(zhuǎn)后的數(shù)組,因此可以直接調(diào)用 .join
  • .join 之后就是我們想要的字符串,直接返回即可
  • 這里用到了 Method Chaining,也就是方法的鏈?zhǔn)秸{(diào)用。只要你熟悉方法的返回值,就可以這么做,好處在于可以不用創(chuàng)建這么多變量

中級解法

  • 直接利用字符串方法,而不需要轉(zhuǎn)換成數(shù)組
function reverseString(str) {
    var result = "";
    for (var i = str.length - 1; i >= 0; i--) {
        result += str[i];
    }
    return newString;
}

解釋

  • 首先我們先創(chuàng)建一個變量,叫 result,用于保存輸出結(jié)果
  • 然后,從右邊開始遍歷字符串。值得注意的是,就像數(shù)組一樣,字符串一樣可以通過所以來獲取某一個字符。比如,str[0] 就是獲取第一個字符。再比如,str[-1] 就是獲取最后一個字符
  • 因為是從右邊開始遍歷,那我們把每次遍歷到的字符直接加到 result 就可以了
  • 需要注意的是邊界條件的確定,因為字符串的索引同樣是從 0 開始的,因此遍歷的初始值要設(shè)置為 str.length - 1,結(jié)束值為 0

高級解法

  • 通過字符串方法以及遞歸來翻轉(zhuǎn)
function reverseString(str) {
    // 設(shè)置遞歸終點(彈出條件)
    if (!str) {
        return "";
    }
    else {
        // 遞歸調(diào)用
        return reverseString(str.substr(1)) + str.charAt(0);
    }
}

解釋

  • 這種方法,一開始不能理解沒關(guān)系。等做到高級算法題,再回來看看應(yīng)該就可以理解了
  • 遞歸涉及到兩個因素,遞歸調(diào)用以及彈出過程。reverseString(str.substr(1)) 就是遞歸調(diào)用,+ str.charAt(0) 就是彈出過程
  • 代碼在執(zhí)行到 reverseString(str.substr(1)) 的時候,會重新調(diào)用 reverseString,并傳入 str.substr(1) 作為參數(shù)。后面的 + str.charAt(0) 暫時不會執(zhí)行
  • 直到遇見傳入的字符串為 "",因為有了 "" 返回值,就不會再去調(diào)用 reverseString 了。這時候,才會一步一步地執(zhí)行 + str.charAt(0),也就是彈出過程

舉個例子:

var str = "abc";

reverseString(str)
  • 執(zhí)行過程如下:
    • 首先執(zhí)行 reverseString("abc"),這時候傳入的 str 不為空,所以執(zhí)行 else 部分。讀到了 reverseString(str.substr(1)),這時候就是遞歸調(diào)用,執(zhí)行這段代碼,其中 str.substr(1)"bc"
      • reverseString("bc"),這時候傳入的 str 不為空,所以執(zhí)行 reverseString(str.substr(1)),其中 str.substr(1)"c"
        • reverseString("c"),這時候傳入的 str 依舊不為空,所以執(zhí)行 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"

至此,我們得到了最終結(jié)果,"cba"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容