第一次写对牛客的编程面试题:输入一个字符串,返回该字符串出现最多的字母

这里备战秋招的小M

今天重拾信心,挑战了一道简单的算法题(源于牛客,链接已贴上)。大家可以先思考一下
统计一个字符串出现最多的字母__牛客网 (nowcoder.com)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dO9qTJcx-1658891506240)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b5f13cb4d0724f008cc21b0c4f505e40~tplv-k3u1fbpfcp-watermark.image?)]

在半个小时的coding后,我发现为啥在vsCode中都ok,但是怎么输入进去就一直报错啊 😰 !!!!慢慢的陷入了沉思,开始逐渐抓狂 💔 !!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpBQA7LH-1658891506243)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3372d9277ba746a1b01e4dba2b07fca3~tplv-k3u1fbpfcp-watermark.image?)]

终于 在不断的思考后💫我睡着了💤

😎第二天,在挣扎中起床,打开电脑,熟练的点开牛客,一键查看解析👀

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VhJml2cM-1658891506244)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8d3172e1a2894c0786d37f8b1c60c9c4~tplv-k3u1fbpfcp-watermark.image?)]

在我的不断尝试下,还是一个测试案例都通不过 😭

💪在我的不懈努力下,发现了在线编程题的coding“秘密”💪

❔为啥我在vscode中代码是对的,但输入在线编辑器就报错

前提:代码逻辑正确

首先,不要以函数的形式输入进去,就直接将逻辑代码写入即可

那我怎么写测试参数呢

这就是我发现的最重要的秘密:
readline();//获取输入字符串``

这样就可以直接获得在线编辑器的测试数据啦

like this

let str = readline();//获取输入字符串

如果是固定好的测试数据,就只能输入固定的答案,所以通不过测试用例
let str = 'aaccc' 我之所以报错的原因之一就是这样干的

其次,记得一定要输入答案哈

😃解题思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZxBO6MV-1658891506245)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0c3b71ca41ee43d29c15fa022e36d71b~tplv-k3u1fbpfcp-watermark.image?)]

再来看下题目,也就是输入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))

小小小小白什么时候能变成算法小白呢😳

如果有不对的地方,欢迎指导

转载:欢迎转载,但未经作者同意,必须保留此段声明;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值