举例:字符串倒置
题目:试编写函数 rev(str)实现将字符串 str 倒置,例如 rev("abc")返回“cba”。
字符串和数组可以相互转化,数组的 reverse()方法可以轻松实现逆序,所以我们可以把字符串转为数组
“借用”一下 reverse()方法,然后再将数组转回字符串。
rev 函数代码如下:
function rev(str){
// 字符串转数组
var arr = str.split("");
// 倒置数组
arr.reverse();
// 转回字符串并返回
return arr.join("");
}
在 REPL 环境测试 rev 函数
本题给我们的启示是:字符串和数组可以通过 split()和 join()相互转换,解决字符串相关问题的时候,
要想起将字符串转为数组,从而利用数组的诸多方法,最后将数组转回字符串。
举例:字符串循环右移
题目:编写函数 rightchange(char,n),实现将字符串 char 循环右移 n 位。例如 rightchange("东西南
北中",2)将返回“北中东西南”。这是因为字符串“东西南北中”循环右移一位变为“中东西南北”,再次循
环右移一位就变为“北中东西南”。
思路 1
可以将字符串转为数组,将数组的末项删除后在队首插入,如此执行 n 次,最后将数组转回字符串即可。
数组的 pop()方法会删除并返回数组的最后一项,我们可以将这项作为 unshift()方法的参数,插入到数
组的队首:
arr.unshift(arr.pop());
这行语句将循环右移字符串 1 位。
容易看出,一个长度是 5 的字符串如“东西南北中”,将它循环右移 5 位,则变回了原来的形态。进一步的,
如果将它循环右移 6 位,变化的效果等同于循环右移 1 位;如果将它循环右移 11 位,变化的效果也等同于循环
右移 1 位。我们可以得出结论:一个字符串 str 循环右移 n 位,变化的效果等同于循环右移 n % str.length
位。
根据这个算法思路,rightchange 函数的代码如下:
function rightchange(char,n){
// 将 n 设置成小于字符串长度的值
n = n % char.length;
// 将字符串转为数组
var arr = char.split("");
// 循环执行 n 次“尾删首推”
var count = n;
while(count--){
arr.unshift(arr.pop());
}
// 转回字符串并返回
return arr.join("");
}
在控制台 REPL 环境测试 rightchange 函数
思路 2
容易看出将字符串“东西南北中”循环右移 2 位,等价于将字符串的倒数 2 个字符移到字符串的开头
根据这个算法思路,rightchange 函数的代码如下:
function rightchange(str,n){
// 将 n 设置成小于字符串长度的值
n = n % str.length;
// 将字符串拆分成两部分
var str1 = str.slice(0 , -n);
var str2 = str.slice(-n);
// 返回两个互换位置后的字符串
return str2 + str1;
}
程序中的 slice()方法不能换为 substring()方法,因为 substring()不接受负数参数。可见,slice() 方
法和 substirng()方法看似相同,其实在真正使用时,差别是不小的。