关于返回字符串char中最长的连续重复字母,比如调用函数maxr("mmmiijjjjkkkkkkssptr") 返回"kkkkkk"
解题思路:
- 遍历所有字符。
2.比较:
如果当前字符 与 上1个字符相同 ==> 计数器加1
如果当前字符 与 上1个字符不相同 ==> 统计计数器的数值 并与 之前最长的那个计数器比较
如果之前的大 忽略不计
如果之前的小 更新 最长计数器,并且更新最长字符。
3.循环结束,输出 最长计数器 个 最长字符。
关于代码
存放:定义一个变量存放最大计数值 maxCount,一个变量存放重复次数最多的字符maxChar,并在最后用于循环输出。
初始化:一般会赋初值,这里把首位字符char[0]用于初始化
代码
function maxr(char){
//var char="mmmiijjjjkkkkkkssptr";
var maxCount=0;
var maxChar="";
var str=char[0];//初始化
var count=1;
for(var i=1;i<char.length;i++){
if(str==char[i]){
count++;
}else{
if(maxCount<count){//比较
maxCount=count;
maxChar=str;
}
//更新计数和最长字符
count=1;
str=char[i];
}
}
for(var j=1;j<=maxCount;j++){
document.write(maxChar);
}
}
maxr("mmmiiijjjjjkkkkkkssptr")
再思考:
考虑到最长字符可能存在多个的情况
1.初始想法的拼接,但在最后输出遍历时会交替出现,于是我把存放最长字符的变量定义了两个 maxChar1, maxChar2 初始化方法相同。
2.当出现maxCount==count,给它一个分支,存入 maxChar2中,最大计数器不更新。特别注意的是,当出现更新最大计数器时(即maxCount<count),相应的要将第二个最大字符存放的变量重置(即var maxChar2=""),防止前面给它更新影响输出结果。最后打印时,maxChar1, maxChar2两个都打印,当最长字符只有一个时,第二个打印空格(人为认为没有打印)。
3.考虑最长字符为3个甚至更多时,同理即可。
终极版代码:
function maxr(char){
//var char="mmmiijjjjkkkkkkssptr";
var maxCount=0;
var maxChar1="";
var maxChar2="";//当最值出现两个时使用
var str=char[0];//初始化
var count=1;
for(var i=1;i<char.length;i++){
if(str==char[i]){
count++;
}else{
if(maxCount<count){//比较
maxCount=count;
maxChar1=str;
maxChar2="";//更换重复字符时,maxChar2要重置(即使前面有两个最值,后面出现最大值时也能处理)
}else if(maxCount==count){//考虑重复次数最多的有两个字符的情况
maxChar2=str;
}
////更新计数和最长字符
count=1;
str=char[i];
}
}
for(var j=1;j<=maxCount;j++){
document.write(maxChar1);
}
document.write("<br/>");
for(var j=1;j<=maxCount;j++){
document.write(maxChar2);//最值只有一个时 打印空格,相当于不打印!
}
}
maxr("mmmiiijjjjjkkkkkkssptr")