Js算法题:统计一个字符串中出现次数最多的字符,并统计次数

相信大家看到这个问题,有可能想到的是类似于以下的答案:

function getmaxObj(str) {
    if (str.length == 1) {
        return str;
    }
    var newObj = {};
    for (var i = 0; i < str.length; i++) {
        if (!newObj[str.charAt(i)])
            newObj[str.charAt(i)] = 1;
        else
            newObj[str.charAt(i)] += 1;
    }
    console.log(newObj )
    var maxObj ={
        maxkey :"",
        maxvalue:0
    }
    for (var k in newObj) {
        if (newObj[k] > maxObj.maxvalue) {
            maxObj.maxvalue = newObj[k];
            maxObj.maxkey = k;
        }
    }
    return maxObj;
}
var result =getmaxObj("zhangpeiyue.com");
// 出现最多的字符:e
console.log("出现最多的字符:"+result.maxkey);
// 出现次数:2
console.log("出现次数:"+result.maxvalue);

但是上面程序有一些小小的问题:如果最多的字符串有多个的话,只能统计出第一个字符串。例如我要统计字符串"zhang":

var result =getmaxObj("zhang");
// 出现最多的字符:z
console.log("出现最多的字符:"+result.maxkey);
// 出现次数:1
console.log("出现次数:"+result.maxvalue);

从结果可以看出,只统计出了字符串"z",而其它符合条件的字符串并没有统计出来,所以这样有些不科学。我们可以将代码优化下(不难理解,所以我就不注释啦):

function getmaxObj(str) {
    if (str.length == 1) {
        return str;
    }
    var newObj = {};
    for (var i = 0; i < str.length; i++) {
        if (!newObj[str.charAt(i)])
            newObj[str.charAt(i)] = 1;
        else
            newObj[str.charAt(i)] += 1;
    }
    console.log(newObj )
    var maxObj ={
        maxkey :[],
        maxvalue:0
    }
    for (var k in newObj) {
        if (newObj[k] > maxObj.maxvalue) {
            maxObj.maxvalue = newObj[k];
            maxObj.maxkey = [k];
        }else if(newObj[k] === maxObj.maxvalue)
            maxObj.maxkey.push(k);
    }
    return maxObj;
}
var result =getmaxObj("zhang");
// 出现最多的字符:z、h、a、n、g
console.log("出现最多的字符:"+result.maxkey.join("、"));
// 出现次数:1
console.log("出现次数:"+result.maxvalue);

欢迎各路大神吐槽!

—————END—————
[公众号回复“电子书”,送你经典前端电子书籍]
喜欢本文的朋友们,欢迎关注微信公众号张培跃,收看更多精彩内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值