js中一道关于如何查找字符串中那个字母出现次数最多的面试题

查找字符串出现次数最多的字符

前言

自我感觉这道题还不错,下面分享笔者觉得还不错的几种方法,欢迎各位看官也可以在评论区分享你们的高见

题目

已尽一个字符串,求出该字符串中出现次数最多的字母,以及出现的次数

解决方案

方案一

主要思路:遍历字符串,把每个字符添加到一个空对象中,作为属性名,初始属性值为1,利用对象属性名不重复的特性,进行判断,如果添加的字符在对象中已尽存在,则让属性值累加一;最后利用for…in循环遍历对象,得到属性值最大的键值对,对应的属性名就是出现次数最对的字符,属性值就是出现的次数。这种思路遍历字符串可以for…of、结合正则用replace、也可以把字符串转换为数组在进行遍历…

let str = 'adqfqncqkujfhahdabdbgf';
let mostTimes = function mostTimes() {
    let reg = /[a-z]/g,
        max = 1,
        res;
    let obj = {};
    str.replace(reg, val => {
        obj[val] === undefined ? obj[val] = 1 : obj[val]++;
    });
    for (let key in obj) {
        if (obj[key] > max) {
            max = obj[key];
            res = key;
        } else if (max === obj[key]) {
            res += `|${key}`;
        }
    };
    return `出现次数最多的字符是:${res},出现的次数是:${max}`
}

console.log(mostTimes());  //=>出现次数最多的字符是:a|d|q|f,出现的次数是:3

方案二

主要思路:对字符串进行排序,把相同的字符放在一起进行循环,如果下一个字符和当前字符相等,则给最开始计数的变量累加一,然后让该值和max的值进行比较,不想等让该值等于最初的值一,循环完以后即可得到想要的结果。这种方法还有个比较大的弊端,如果出现两个或者多个字符出现的次数一样多

let str = 'adqfqncqkujfhahdabdbgf';
let mostTimes = function mostTimes() {
    let max = 1,
        val = 1,
        res;
    let url = str.split('').sort((a,b)=>a.localeCompare(b)).join(''); //=>把字符串先转换为数组,然后进行排序
    console.log(url);
    for (let i = 0; i < url.length - 1; i++) { // 因为每次比较都是和下一个字符进行比较,所以不需要拿到最后一个字符
        if (url[i] === url[i + 1]) {
            val++;
            if (val > max) {
                max = val;
                res = url[i];
            } else if(val === max) {
            res+=`|${url[i]}`;
        } else {
            val = 1;
        }
    };
    return `出现次数最多的字符是:${res},出现的次数是:${max}`
}
console.log(mostTimes()); //=>出现次数最多的字符是:a|d|f|q,出现的次数是:3

方案三

主要思路:先把字符串进行排序(和方案二一样),得到字符串总长度length,,把length赋值给循环体中的 i 进行循环,每次循环循环体中的 i 减一,同时new一个正则,该正则利用分组引用的对字符串进行匹配,如果匹配成功对应的字符就是出现次数最多的字符,当前循环体中的 i 就是出现的次数

let str = 'adqfqncqkujfhahdabdbgf';
//方案三
// 写一个正则/[a-z]{i-1}/g;
let mostTimes = function mostTimes() {
    let max = 1,
        res;
    str = str.split('').sort((a, b) => a.localeCompare(b)).join('');
    for (let i = str.length; i > 0; i--) {
        let reg = new RegExp(`([a-z])\\1{${i-1}}`, 'g');
        if (reg.test(str)) {
            max = i;
            res = RegExp.$1;
            break;
        }
    };
    return `出现次数最多的字符是:${res},出现的次数是:${max}`;
}
console.log(mostTimes()); //=>出现次数最多的字符是:a,出现的次数是:3

参考

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值