0
点赞
收藏
分享

微信扫一扫

举例:将每个单词首字母变为大写

试将字符串“I love javascript very much”的每个单词的首字母变为大写。

字符串拥有 toUpperCase()方法,可以将字符串转换为大写形式。本题的关键是如何提取语句中的每个单

词,得到它们的首字母。

注意到题目所给字符串的每个单词之间都由空格隔开,所以可以调用 split(" ")方法让字符串以空格为分隔符转换为数组["I","love","javascript","very","much"]。遍历这个数组,将每个单词首字母变为大写,

再调用 join()方法将数组转回字符串。

根据这个算法思路,书写代码如下:

// 定义字符串

var str = "I love javascript very much";

// 转为数组

var arr = str.split(" ");

// 数组遍历

for(var i = 0 ; i <= arr.length-1 ; i++){

// 将每一项的第一个字符大写,与后面的字符拼接后,重新赋值给每一项

arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1);

}

// 转回字符串

str = arr.join(" ");

// 输出结果

console.log(str);

举例:寻找最长连续重复字母

 题目要求

编写函数 maxr(char) 返回字符串 char 中最长的连续重复字母。比如 maxr("aabbbccccdd")将返回"c",

因为字母 c 连续重复出现了 4 次,超过了所有其它字母。

 算法

这个题目需要使用“双指针法”,这是处理字符串同类问题的常用方法。

“双指针法”具体思路是:准备两个变量 i=0 和 j=1,它们分别指向字符串的第 0 位和第 1 位,即变量 i、

j 的值表示的是它们“指向”字符串的第几位,我们称这样的变量为“指针”

编写程序让 i 和 j 共同配合完成对字符串的遍历。遍历的规则是这样的:

 如果 i 指向的字母和 j 指向的字母相同,则 i 指针不动,j 后移。

 否则,i 指针追上 j 指针,j 后移。

我们用字符串“aabbbccccdd”来完整模拟演示两个指针对字符串遍历的过程:

程序一开始 i 指向字母 a,j 也指向字母 a,两个指针指向的字母相同,此时 i 指针不动,j 后移。

此时 i 指向字母 a,j 指向字母 b,两个指针指向的字母不同。能够观察到,i 和 j 之间的字母一定是同一

个字母(不包括 j 此时指向的字母),记录此时指针 j 和 i 的差,它表示字母 a 连续出现的次数。

因为 i 和 j 指向的字母不同,所以让 i 指针追上 j 指针,j 指针后移,i、j 指向的字母又一次相同了,所以 i 指针不动,j 后移。j 后移仍然指向字母 b,所以继续“i 不动,j

后移”。容易看出,直到 j 指向了第一个字母 c 时,i 指针是一直不动的。

能够观察到,i 和 j 之间的字母一定是同一个字母(不包括 j 指向的字母),记录此时 j 和 i 的差,它表示

字母 b 连续出现的次数。它比刚才记录的字母 a 连续出现的次数更大么?如果是,则替换这个最大值。

就这样继续遍历下去,直到 i 指针指向了字符串的末尾。在遍历过程中,不断替换当前最长连续重复字母,

当遍历结束后,字符串中最长连续重复的字母也就找到了。

代码实现

maxr 函数完整代码如下:

function maxr(char){

// 存储下标的变量

var i = 0;

var j = 1;

// 存储临时最大长度和最长子串的变量

var maxlength = 0;

var maxchar = "";

// 循环下标进行对比,直到 a 走到最后

while(i < char.length){

// 比较 a 位置和 b 位置字符是否相同

if(char.charAt(i) == char.charAt(j)){

// 如果相等,让 b 加 1,继续下次比较

j++;

}else{

// 如果不相等,比较这一次的长度是否大于临时长度

if(j - i > maxlength){

maxlength = j - i;

//这个字符变为当前的最长重复字母

maxchar = char.charAt(i);

}

// 存储后,继续比较下一次,i 直接走到 j 位置

i = j;

j ++;

}

}

// 循环结束后,maxchar 记录了最大的重复子串直接返回

return maxchar;

}

在控制台的 REPL 环境测试函数 maxr


举报

相关推荐

0 条评论