今天在线做某公司的笔试题,题目要求,实现输入字符串,并计算字符串内所有碎片的长度和。
如,'aaabbbcccaa',则输出11 其碎片为'aaa'、'bbb'、'ccc'、'aa'。
刚开始写的时候只知道用for循环:
function a(line){
//arr用来存储已经找到的碎片,str为初始碎片
let arr=[],str = line[0],len=line.length;
for(let i=1;i<len;i++){
if(line[--i]==line[i]){ //如果后面字符与前一个相同,则仍追加到一个碎片中
str+=line[i];
}else{
if(!arr.includes(str)){ //碎片不存在则存入arr中
arr.push(str)
}
str=line[i];
}
}
return(arr.join('').length);
}
结果不仅是内存消耗超出人家的要求,还跑不出来结果,我觉得我的思路没啥问题啊,如果有大神看到,请赐教。
在快要交卷的时候灵光一闪想到了用两个while,虽然不知道为什么,但就是大胆试了一下
function a(line){
let arr=[],len=line.length,i=0;
while(i<len){
let j = i+1,str=line[i];
while(line[i]==line[j]){
str+=line[j];
j++;
}
if(!arr.includes(str)){
arr.push(str)
}
i=j;
}
console.log(arr.join('').length);
}
交卷前也没来得及测试一下,现在只能抱有丝丝幻想能给予我一定的步骤分了。