字符串反轉方法匯總


  • split()方法將一個字符串對象的每個字符拆出來,並且將每個字符串當成數組的每個元素
  • reverse()方法用來改變數組,將數組中的元素倒個序排列,第一個數組元素成為最后一個,最后一個變成第一個
  • join()方法將數組中的所有元素邊接成一個字符串

來看個實例:

 1 function reverseString(str) {
 2     // 第一步,使用split()方法,返回一個新數組
 3     // var splitString = "hello".split("");
 4 
 5     var splitString = str.split(""); //將字符串拆分
 6 
 7     // 返回一個新數組["h", "e", "l", "l", "o"]
 8 
 9     // 第二步,使用reverse()方法創建一個新數組
10     // var reverseArray = ["h", "e", "l", "l", "o"].reverse();
11 
12     var reverseArray = splitString.reverse(); 
13     // 原數組元素順序反轉["o", "l", "l", "e", "h"]
14 
15     // 第三步,使用join()方法將數組的每個元素連接在一起,組合成一個新字符串
16     // var joinArray = ["o", "l", "l", "e", "h"].join("");
17 
18     var joinArray = reverseArray.join(""); 
19     // "olleh"
20 
21     // 第四步,返回一個反轉的新字符串
22     return joinArray; // "olleh"
23 }
24 
25 reverseString("hello"); // => olleh

將上面的方法簡化一下,可以寫成這樣:

1 function reverseString(str) {
2     return str.split("").reverse().join("");
3 }
4 reverseString("hello"); // => olleh

使用一個遞減循環遍歷將字符串反轉

這種方法使用的是一個for循環給原字符串做一個遞減遍歷,然后將遍歷的字符串重新合並成一個新字符串:

 1 function reverseString(str) {
 2     // 第一步:創建一個空的字符串用來存儲新創建的字符串
 3 
 4     var newString = "";
 5 
 6     // 第二步:使用for循環
 7     // 循環從str.length-1開始做遞減遍歷,直到 i 大於或等於0,循環將繼續
 8     // str.length - 1對應的就是字符串最后一個字符o
 9 
10     for (var i = str.length - 1; i >= 0; i--) { 
11         newString += str[i]; // 或者 newString = newString + str[i];
12     }
13 
14     // 第三步:返回反轉的字符串
15     return newString; 
16 }
17 
18 reverseString('hello'); // => // "olleh"

簡單的看看字符串遍歷的過程。假設需要將字符串"hello"反轉。其整個遍歷過程如下表所示:

迭代順序 對應i的值 新字符串 newString
每次迭代 str.length - 1 newString + str[i]
第一次迭代 5 - 1 = 4 "" + "o" = "o"
第二次迭代 4 - 1 = 3 "o" + "l" = "ol"
第三次迭代 3 - 1 = 2 "ol" + "l" = "oll"
第四次迭代 2 - 1 = 1 "oll" + "e" = "olle"
第五次迭代 1 - 1 = 0 "olle" + "h" = "olleh"

其實上面的for循環,也可以換成while循環:

 1 function reverseString (str) {
 2     var newString = '';
 3     var i = str.length;
 4 
 5     while (i > 0) {
 6         newString += str.substring(i - 1, i);
 7         i--;
 8     }
 9 
10     return newString;
11 }
12 
13 reverseString("hello"); // => olleh

while循環中substring()方法。substring() 返回字符串兩個索引之間(或到字符串末尾)的子串。

使用遞歸實現字符串反向

使用String.prototype.substr()String.prototype.charAt()方法也可以將一個字符串反向。

substr() 方法返回字符串中從指定位置開始到指定長度的子字符串。比如:

1 var str = "abcdefghij";
2 
3 console.log("(1,2): "    + str.substr(1,2));   // (1,2): bc
4 console.log("(-3,2): "   + str.substr(-3,2));  // (-3,2): hi
5 console.log("(-3): "     + str.substr(-3));    // (-3): hij
6 console.log("(1): "      + str.substr(1));     // (1): bcdefghij
7 console.log("(-20, 2): " + str.substr(-20,2)); // (-20, 2): ab
8 console.log("(20, 2): "  + str.substr(20,2));  // (20, 2):

charAt() 方法返回字符串中指定位置的字符。字符串中的字符從左向右索引,第一個字符的索引值為 0,最后一個字符(假設該字符位於字符串 stringName 中)的索引值為 stringName.length - 1。 如果指定的 index 值超出了該范圍,則返回一個空字符串。

1 var anyString = "Brave new world";
2 console.log("The character at index 0   is '" + anyString.charAt(0)   + "'"); // =>The character at index 0 is 'B'
3 console.log("The character at index 1   is '" + anyString.charAt(1)   + "'"); // =>The character at index 1 is 'r'
4 console.log("The character at index 2   is '" + anyString.charAt(2)   + "'"); // =>The character at index 2 is 'a'
5 console.log("The character at index 3   is '" + anyString.charAt(3)   + "'"); // => The character at index 3 is 'v'
6 console.log("The character at index 4   is '" + anyString.charAt(4)   + "'"); // => The character at index 4 is 'e'
7 console.log("The character at index 999 is '" + anyString.charAt(999) + "'"); // => The character at index 999 is ''

結合起來,我們可以這樣做實現字符串反向:

1 function reverseString(str) {
2     if (str === "") {
3         return "";
4     } else {
5         return reverseString(str.substr(1)) + str.charAt(0);
6     }
7 }
8 reverseString("hello"); // => olleh

第一部分的遞歸方法。你需要記住,你不會只調用一次,你將會有幾個嵌套的調用。

每次調用str === "?" reverseString(str.subst(1)) + str.charAt(0)
第一次調用 reverseString("Hello") reverseString("ello") + "h"
第二次調用 reverseString("ello") reverseString("llo") + "e"
第三次調用 reverseString("llo") reverseString("lo") + "l"
第四次調用 reverseString("lo") reverseString("o") + "l"
第五次調用 reverseString("o") reverseString("") + "o"

第二部分的遞歸方法。

每次調用 返回
第五次調用 reverseString("") + "o" = "o"
第四次調用 reverseString("o") + "l" = "o" + "l"
第三次調用 reverseString("lo") + "l" = "o" + "l" + "l"
第二次調用 reverserString("llo") + "e" = "o" + "l" + "l" + "e"
第一次調用 reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h"

上面的方法還可以繼續改良一下,改成三元操作符:

1 function reverseString(str) {
2     return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
3 }
4 reverseString("hello"); // => olleh

  還可以換成這樣的方式

1 function reverseString(str) {
2   return str && reverseString(str.substr(1)) + str[0];
3 }
4 reverseString("hello"); // => olleh

除了上面的方法之外,其實還有其他一些方法:

方法一

1 function reverseString (str) {
2     var newString = [];
3     for (var i = str.length - 1, j = 0; i >= 0; i--, j++) {
4         newString[j] = str[i];
5     }
6     return newString.join('');
7 }
8 
9 reverseString("hello"); // => olleh

方法二

1 function reverseString (str) {
2     for (var i = str.length - 1, newString = ''; i >= 0; newString += str[i--] ) {
3 
4     }
5     return newString;
6 }
7 
8 reverseString("hello"); // => olleh

 

方法三

1 function reverseString (str) {
2     function rev(str, len, newString) {
3         return (len === 0) ? newString : rev(str, --len, (newString += str[len]));
4     }
5     return rev(str, str.length, '');
6 }
7 reverseString("hello"); // =>olleh

 

方法四

 1 function reverseString (str) {
 2     str = str.split('');
 3     var len = str.length,
 4         halfIndex = Math.floor(len / 2) - 1,
 5         newString;
 6     for (var i = 0; i <= halfIndex; i++) {
 7         newString = str[len - i - 1];
 8         str[len - i - 1] = str[i];
 9         str[i] = newString;
10     }
11     return str.join('');
12 }
13 reverseString("hello"); // => olleh

 

方法五

1 function reverseString (str) {
2     if (str.length < 2) {
3         return str;
4     }
5     var halfIndex = Math.ceil(str.length / 2);
6     return reverseString(str.substr(halfIndex)) + reverseString(str.substr(0, halfIndex));
7 }
8 
9 reverseString("hello"); // =>olleh

 

方法六

1 function reverseString(str) {
2   return [].reduceRight.call(str, function(prev, curr) {
3     return prev + curr;
4   }, '');
5 }
6 
7 reverseString("hello"); // =>olleh

ES6的方法

在ES6中,可以變得更為簡單一些,如:

1 [...str].reverse().join('');

或者:

1 [...str].reduceRight( (prev, curr) => prev + curr );

或者:

1 const reverse = str => str && reverse(str.substr(1)) + str[0];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM