字符串反转方法汇总
2016-05-19 23:08
330 查看
split()方法将一个字符串对象的每个字符拆出来,并且将每个字符串当成数组的每个元素
reverse()方法用来改变数组,将数组中的元素倒个序排列,第一个数组元素成为最后一个,最后一个变成第一个
join()方法将数组中的所有元素边接成一个字符串
来看个实例:
将上面的方法简化一下,可以写成这样:
使用一个递减循环遍历将字符串反转
这种方法使用的是一个
简单的看看字符串遍历的过程。假设需要将字符串"hello"反转。其整个遍历过程如下表所示:
其实上面的
在
结合起来,我们可以这样做实现字符串反向:
第一部分的递归方法。你需要记住,你不会只调用一次,你将会有几个嵌套的调用。
第二部分的递归方法。
上面的方法还可以继续改良一下,改成三元操作符:
还可以换成这样的方式
除了上面的方法之外,其实还有其他一些方法:
ES6的方法
在ES6中,可以变得更为简单一些,如:
或者:
或者:
reverse()方法用来改变数组,将数组中的元素倒个序排列,第一个数组元素成为最后一个,最后一个变成第一个
join()方法将数组中的所有元素边接成一个字符串
来看个实例:
function reverseString(str) { // 第一步,使用split()方法,返回一个新数组 // var splitString = "hello".split(""); var splitString = str.split(""); //将字符串拆分 // 返回一个新数组["h", "e", "l", "l", "o"] // 第二步,使用reverse()方法创建一个新数组 // var reverseArray = ["h", "e", "l", "l", "o"].reverse(); var reverseArray = splitString.reverse(); // 原数组元素顺序反转["o", "l", "l", "e", "h"] // 第三步,使用join()方法将数组的每个元素连接在一起,组合成一个新字符串 // var joinArray = ["o", "l", "l", "e", "h"].join(""); var joinArray = reverseArray.join(""); // "olleh" // 第四步,返回一个反转的新字符串 return joinArray; // "olleh" } reverseString("hello"); // => olleh
将上面的方法简化一下,可以写成这样:
function reverseString(str) { return str.split("").reverse().join(""); } reverseString("hello"); // => olleh
使用一个递减循环遍历将字符串反转
这种方法使用的是一个
for循环给原字符串做一个递减遍历,然后将遍历的字符串重新合并成一个新字符串:
function reverseString(str) { // 第一步:创建一个空的字符串用来存储新创建的字符串 var newString = ""; // 第二步:使用for循环 // 循环从str.length-1开始做递减遍历,直到 i 大于或等于0,循环将继续 // str.length - 1对应的就是字符串最后一个字符o for (var i = str.length - 1; i >= 0; i--) { newString += str[i]; // 或者 newString = newString + str[i]; } // 第三步:返回反转的字符串 return newString; } 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循环:
function reverseString (str) { var newString = ''; var i = str.length; while (i > 0) { newString += str.substring(i - 1, i); i--; } return newString; } reverseString("hello"); // => olleh
在
while循环中
substring()方法。
substring()返回字符串两个索引之间(或到字符串末尾)的子串。
使用递归实现字符串反向
使用String.prototype.substr()和
String.prototype.charAt()方法也可以将一个字符串反向。
substr()方法返回字符串中从指定位置开始到指定长度的子字符串。比如:
var str = "abcdefghij"; console.log("(1,2): " + str.substr(1,2)); // (1,2): bc console.log("(-3,2): " + str.substr(-3,2)); // (-3,2): hi console.log("(-3): " + str.substr(-3)); // (-3): hij console.log("(1): " + str.substr(1)); // (1): bcdefghij console.log("(-20, 2): " + str.substr(-20,2)); // (-20, 2): ab console.log("(20, 2): " + str.substr(20,2)); // (20, 2):
charAt()方法返回字符串中指定位置的字符。字符串中的字符从左向右索引,第一个字符的索引值为
0,最后一个字符(假设该字符位于字符串
stringName中)的索引值为
stringName.length - 1。 如果指定的
index值超出了该范围,则返回一个空字符串。
var anyString = "Brave new world"; console.log("The character at index 0 is '" + anyString.charAt(0) + "'"); // =>The character at index 0 is 'B' console.log("The character at index 1 is '" + anyString.charAt(1) + "'"); // =>The character at index 1 is 'r' console.log("The character at index 2 is '" + anyString.charAt(2) + "'"); // =>The character at index 2 is 'a' console.log("The character at index 3 is '" + anyString.charAt(3) + "'"); // => The character at index 3 is 'v' console.log("The character at index 4 is '" + anyString.charAt(4) + "'"); // => The character at index 4 is 'e' console.log("The character at index 999 is '" + anyString.charAt(999) + "'"); // => The character at index 999 is ''
结合起来,我们可以这样做实现字符串反向:
function reverseString(str) { if (str === "") { return ""; } else { return reverseString(str.substr(1)) + str.charAt(0); } } 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" |
function reverseString(str) { return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0); } reverseString("hello"); // => olleh
还可以换成这样的方式
function reverseString(str) { return str && reverseString(str.substr(1)) + str[0]; } reverseString("hello"); // => olleh
除了上面的方法之外,其实还有其他一些方法:
方法一
function reverseString (str) { var newString = []; for (var i = str.length - 1, j = 0; i >= 0; i--, j++) { newString[j] = str[i]; } return newString.join(''); } reverseString("hello"); // => olleh
方法二
function reverseString (str) { for (var i = str.length - 1, newString = ''; i >= 0; newString += str[i--] ) { } return newString; } reverseString("hello"); // => olleh
方法三
function reverseString (str) { function rev(str, len, newString) { return (len === 0) ? newString : rev(str, --len, (newString += str[len])); } return rev(str, str.length, ''); } reverseString("hello"); // =>olleh
方法四
function reverseString (str) { str = str.split(''); var len = str.length, halfIndex = Math.floor(len / 2) - 1, newString; for (var i = 0; i <= halfIndex; i++) { newString = str[len - i - 1]; str[len - i - 1] = str[i]; str[i] = newString; } return str.join(''); } reverseString("hello"); // => olleh
方法五
function reverseString (str) { if (str.length < 2) { return str; } var halfIndex = Math.ceil(str.length / 2); return reverseString(str.substr(halfIndex)) + reverseString(str.substr(0, halfIndex)); } reverseString("hello"); // =>olleh
方法六
function reverseString(str) { return [].reduceRight.call(str, function(prev, curr) { return prev + curr; }, ''); } reverseString("hello"); // =>olleh
ES6的方法
在ES6中,可以变得更为简单一些,如:
[...str].reverse().join('');
或者:
[...str].reduceRight( (prev, curr) => prev + curr );
或者:
const reverse = str => str && reverse(str.substr(1)) + str[0];
相关文章推荐
- Google官方 由浅入深详解Fragment【附Fragment使用常见问题】
- android收货地址整理
- poj 3384 半平面交
- Android 截屏技术
- 简单的图片查看器---ImageView的学习
- ICMP
- jmeter(3)简单的HTTP请求(非录制)
- QT类中keyPressEvent函数的重写
- python实现进度条--主要用在上传下载文件
- python实现进度条--主要用在上传下载文件
- MVP模式
- EntityFramework Code-First 简易教程(六)-------领域类配置之DataAnnotations
- python实现进度条--主要用在上传下载文件
- 要注意php for中变量的清空
- 勿忘初心!!!
- C++虚基类的实现机制:笔记
- poj 3525 凸多边形多大内切圆
- poj 1279 半平面交核面积
- 为结构体分配额外存储空间的方法
- Android Launcher分析和修改4——初始化加载数据