试将字符串“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