0
点赞
收藏
分享

微信扫一扫

实战案例:字符串常见算法

举例:字符串倒置

题目:试编写函数 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()方法看似相同,其实在真正使用时,差别是不小的。


举报

相关推荐

0 条评论