这里备战秋招的小M
今天重拾信心,挑战了一道简单的算法题(源于牛客,链接已贴上)。大家可以先思考一下
统计一个字符串出现最多的字母__牛客网 (nowcoder.com)
在半个小时的coding后,我发现为啥在vsCode中都ok,但是怎么输入进去就一直报错啊 😰 !!!!慢慢的陷入了沉思,开始逐渐抓狂 💔 !!!
终于 在不断的思考后💫我睡着了💤
😎第二天,在挣扎中起床,打开电脑,熟练的点开牛客,一键查看解析👀
在我的不断尝试下,还是一个测试案例都通不过 😭
💪在我的不懈努力下,发现了在线编程题的coding“秘密”💪
❔为啥我在vscode中代码是对的,但输入在线编辑器就报错
前提:代码逻辑正确
首先,不要以函数的形式输入进去,就直接将逻辑代码写入即可
那我怎么写测试参数呢
这就是我发现的最重要的秘密:
readline();
//获取输入字符串``
这样就可以直接获得在线编辑器的测试数据啦
like this
let str = readline();//获取输入字符串
如果是固定好的测试数据,就只能输入固定的答案,所以通不过测试用例
let str = 'aaccc' 我之所以报错的原因之一就是这样干的
其次,记得一定要输入答案哈
😃解题思路
再来看下题目,也就是输入aab=> a , aaccc=>c , aabbcccddddd => d
道理咱都懂,对我我这种算法小小小小小白而言,第一次想到的是 下标计数法
但是明显是行不通的
思路:
1.处理字符串,将字符串转化为数组去遍历每一个字符(split()将字符串分割为数组)
2.新建一个map对象存储每一个字符key和出现次数value(相当于一个计数器)
3.for循环遍历(用for…in也是可以的),并判断map的key中是否存在当前的字符,存在则value+1;不存在则set一个,value设为0
4.获取map的value中的最大值(通过循环,找到最大值的同时获得key)
在这个地方我最开始我的思路出现了错误,我想直接用Math.max()直接获取values的最大值就一步到位了,但是我去拿到对应的key好像更麻烦
Math.max(...map.values())
5.输出
💟代码
let str = readline();//获取输入字符串
const map=new Map()//计数器
let arr = str.split('') //将字符串分割为数组
for(let i = 0 ; i < arr.length;i++){
let val =map.get(arr[i])
if(val){
map.set(arr[i],val+1)
}else{
map.set(arr[i],1)
}
}
let max=0; //最大值
let key
map.forEach((v,k) => {
if(max<v){
max=v
key=k
}
})
console.log(key)
🌞其实代码这样写也是对的,但是注意在线编辑器的一些特点
let str = 'aabbbccccc'
function countCase(str){
//计数器
let map=new Map()
let str2 = str.split('')
for(let i = 0 ; i < str2.length;i++){
let val =map.get(str2[i])
if(val){
map.set(str[i],val+1)
}else{
map.set(str[i],1)
}
}
let max=0;
let key
map.forEach((v,k) => {
if(max<v){
max=v
key=k
}
})
// console.log(key);
return key
}
console.log(countCase(str))
小小小小白什么时候能变成算法小白呢😳
如果有不对的地方,欢迎指导
转载:欢迎转载,但未经作者同意,必须保留此段声明;