第 114 题:找出字符串中连续出现最多的字符和个数
'abcaakjbb' => {'a':2,'b':2} 'abbkejsbcccwqaa' => {'c':3}
注意:题目说的是连续出现,注意连续二字。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
'abcaakjbb' => {'a':2,'b':2} 'abbkejsbcccwqaa' => {'c':3}
注意:题目说的是连续出现,注意连续二字。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(55)
得到的结果是
从这个数组里面找长度最长的元素并转化成需要的结果应该简单了吧
习惯了用正则处理一些字符串的问题,感觉还可以优化,期待大佬版本
添加最大长度为1的情况Object.fromEntries 是 ES10 语法,使用高版本的浏览器或者 NodeJs 版本运行
全面通用~~~
getMax('abc') // {a:1,b:1,c:1}
getMax('abcaakjbb') // {a: 2, b: 2}
getMax('abbkejsbcccwqaa') //{c: 3}
getMax('assssssssssssssssbaasdasdasdasgfsgsgsadgc') ////{s: 16}
是连续出现最多,不是出现最多
上面的麻烦学学markdown语法再发好吗?看着难受
强行使用map保存了每个连续字符串的个数,然后在使用遍历找到出现次数最多的一个或者多个
空间复杂度: O(1);时间复杂度: O(N)
function getMax(){
let str = 'bacdd33333';
let arr = [];
let arr1 = [];
let count = 1;
let max = null;
let obj = {};
for(let i=0;i<str.length;i++){
if(str[i] == str[i+1]){
count+=1;
}else{
count = 1;
}
arr1.push(count);
arr.push({key:str[i],count:count});
max = Math.max(...arr1);
}
for(let item of arr){
if(item.count == max){
obj[item.key] = item.count
}
}
return obj;
}
getMax()
菜鸟版本
看大佬们都使用正则表达式进行匹配,小弟就不用正则来个版本
主要思路如下:
想要计算出现的次数,则需要遍历,这里通过Array.prototype.reduce方法,遍历每一个字符
题目又说是连续出现,那么只要单个字符出现2次以上,就要储存,所以这里在遍历的时候,通过reduce的第二个参数保存一个temp对象。
根据temp中该字符重复出现的次数就行逻辑判断。
结果出来以后,删除
strToObj
中的temp
属性。通过
Math.max
以及Object.values
方法找出最大值max
。filter
对象strToObj
,找出值等于max
的。最后在使用
reduce
拼接结果返回。你这个 输入 ab 返回 {a:1}
function findNum(str){
let res = {};
let num = 1;
let max = num;
for(let i=0;i<str.length;i++){
if(str[i+1] === str[i]){
num++;
} else {
if(num>max){
res = {};
res[str[i]] = num;
max = num;
num = 1;
} else if(num === max){
res[str[i]] = num;
num = 1;
}
}
}
return res;
}
const data = 'abbkejsbcccwqaaaa';
console.log(findNum(data));
一次遍历完成,复杂度O(n)
得到的结果是
从这个数组里面找长度最长的元素并转化成需要的结果应该简单了吧
可以简化很多计算量!
Map集合连续出现次数
数据reduce获取最大次数 再生成结果
关于字符串和数组的“连续”问题,一般可以用滑动窗口来解决。
PS: 因为 maxCount 在遍历过程中会一直增加,如果用字符做 key,次数做 value,最后输出结果还需要找到最大的次数来输出,如果直接用当前 maxCount 做 key,出现过 maxCount 次的字符做值,最后只需在 map 中找到 key 为最后 maxCount 值的字符数组,里面的字符就是连续出现过最多次数的
双指针 一次遍历 除开输出 空间O(1)
`
`
我写了个最low的,花了1.5小时。。。虽然周围很吵,但是一开始确实没思路
卧槽,我看错了,没注意是连续!!!以下代码找的是所有
连续的low版实现(不会正则,第一次忘了Math.max)
最终简化版
一次遍历
时间复杂度O(n), 空间复杂度O(1)
暴力版