原文鏈接:http://singsing.io/blog/2017/03/17/fcc-basic-reverse-a-string/
翻轉(zhuǎn)字符串 (Reverse a String)
題目鏈接
問題解釋
- 這個
function接收一個字符串參數(shù),返回翻轉(zhuǎn)后的字符串 - 比如接收的是 "hello",那么輸出就是 "olleh"
參考鏈接
思路提示
- 先把字符串分割成為數(shù)組
- 翻轉(zhuǎn)數(shù)組
- 把翻轉(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"
- 首先執(zhí)行 reverseString("abc"),這時候傳入的
至此,我們得到了最終結(jié)果,"cba"