javascript - js统计字符串中出现次数最多的字符?
天蓬老师
天蓬老师 2017-04-10 16:56:46
[JavaScript讨论组]

我的思路是:循环比较取出相同的字符,如果相同则次数自加。但是不知道哪里错了。现在的运行结果是每个字符出现的次数的累加和。。。
代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript" src="http://yancy.cachepro.com/jq/JQ214.js"></script>
<script>
$(document).ready(function(){
    $("#button").click(function(){
        var a = $("#input").val();
        var l = a.length;
        var count = 0, temp = 0;
        
        for(var i=0; i<l; i++){
            
                    for(var n=0;n<l;n++){
                        
                        if(a.charAt(n) == a.charAt(i)){
                            temp++;
                        }
                        
                    }
                    
            if(temp > count){
                count = temp;
                    }
        };
        alert (temp);
        })
})
</script>
</head>

<body>
<input id="input" />
<button id="button">获取</button>

</body>
</html>
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(7)
巴扎黑

把中间的部分换成下面这样,原因是每次循环的时候temp没有初始化,另外最后alert的应该是count吧...

        var a = $("#input").val();
        var l = a.length;
        var count = 0;
        
        for(var i=0; i<l; i++){
            var temp=0;
            for(var n=0;n<l;n++){
                if(a.charAt(n) == a.charAt(i)){
                     temp++;
                }
            }        
            if(temp > count){
                count = temp;
            }
        };
        alert (count);
伊谢尔伦

es6

let theMost = str => str.split('').sort().join('').match(/(\S)\1*/g).sort((a,b)=>b.length-a.length)[0][0]

es5

function theMost(str){
    return str.split('').sort().join('').match(/(\S)\1*/g).sort(function(a,b){
        return b.length - a.length
    })[0][0]
}
PHPz
var freq =  "Hello world!".split('').reduce(function(acc, elem){ acc[elem] = (acc[elem]||0)+1  ; return acc;}, {});
// -> { H: 1, e: 1, l: 3, o: 2, ' ': 1, w: 1, r: 1, d: 1, '!': 1 }

var most_freq = Object.keys(freq).sort(function(a,b){ return freq[a] - freq[b]}).pop();
// -> 'l'
PHP中文网

给你个优雅点和效率点的方案吧

var str = '我爱北京天安门,天安门上太阳升';
var freqs = {}; // 用来记录所有的字符的出现频次
var mostFreqChar = ''; //用来记录最大频次的字符
for (var i = 0; i < str.length; i++) {
    var char = str[i];
    if (!freqs[char]) {
        freqs[char] = 0;
    }
    freqs[char] ++;
    if (mostFreqChar == '' || freqs[char] > freqs[mostFreqChar]) {
        mostFreqChar = char;
    }
}
console.log(freqs);
console.log(mostFreqChar);

当然了,一眼看过去就知道,其实正确的答案应该是“天安门”三个字都是最大频次的字符,目前的逻辑只能输出第一个,如果要输出这所有频次相同的最大频次字符,还需要稍微做一些改进

高洛峰

细想了一下,给个思路:

function getMostChart(str){
    if( str.length < 2 ) return [str];
    var strs = str.split('').sort();
    var counters = [];
    var first_i = 0;

    strs[strs.length] = undefined; //添加不等于字符串的最后一项以便循环执行
    for( var i = 1, len = strs.length; i < len; i++ ){
        if( strs[i] !== strs[first_i] ){
            var counter = i - first_i;
            if( ! counters[ counter ] ) counters[ counter ] = [];
            counters[ counter ].push( strs[first_i] );
            first_i = i;
        }
    }

    return counters[counters.length - 1];
}

先将字符串排序,然后循环计算每个字符出现的次数,并将出现相同次数的值放在以次数为索引的缓存数组中,然后,缓存数组的最后项即为出现次数最多的字符串数组;
即如:

str = 'esd' 
// counters[1] = ['e', 's', 'd'];
str = 'ese' 
// counters[1] = ['s']; counters[2] = ['e']; - e 出现次数最多
str = 'esee' 
// counters[1] = ['s']; counters[3] = ['e']; - e 出现次数最多
str = 'esesa' 
// counters[1] = ['a']; counters[2] = ['e', 's']; - e, s 出现次数最多

测试结果如下:

getMostChart('你好好')
// ["好"]
getMostChart('你好好哈哈哈')
// ["哈"]
getMostChart('aaa')
// ["a"]
getMostChart('aaacd')
// ["a"]
getMostChart('aaacdeedddd')
// ["d"]
getMostChart('我爱北京天安门,天安门上太阳升')
// ["天", "安", "门"]
黄舟

先切割字符串为数组,然后遍历产生字典,再根据出现次数排序,最后输出出现最多的字符数组,代码如下:

document.addEventListener('DOMContentLoaded', function(){
  var form = document.querySelector('#form');
  form.addEventListener('submit', submitForm);
});
Array.prototype.add = function(item){
  var self = this;
  if(self.indexOf(item) < 0){
    self.push(item);
  }
  return self;
};
Object.prototype.increase = function(key){
  var self = this,
      val = self[key]*1 || 0;
  self[key] = val + 1;
  return self;
};
var analysisString = function(str){
  str = str || '';
  var arr = str.split(''),
      freqMap = {},
      mostFreq = [];
  arr.forEach(function(item){
    freqMap.increase(item);
    mostFreq.add(item);
  });
  mostFreq = mostFreq.sort(function(a, b){
    return freqMap[b] - freqMap[a];
  }).filter(function(item, i){
    if(freqMap[item] === freqMap[mostFreq[0]]){
      return item;
    }
  });
  return {
    mostFreq : mostFreq,
    freqNum : freqMap[mostFreq[0]]
  };
},
submitForm = function(event){
  event.preventDefault();
  var self = this,
      string = self.querySelector('[name=string]').value,
      result = document.querySelector('#result'),
      ret = analysisString(string);
  result.innerHTML = [
    '<li><h3>出现最多的字符是:</h3><p>'+ ret.mostFreq.join(',') +'</p></li>',
    '<li><h3>出现次数:</h3><p>'+ ret.freqNum +'</p></li>'
  ].join('');
};

http://codepen.io/interjc/pen/GoyMyB

怪我咯
 function demo(str){
            strs = str.split("").sort();//将字符串分解成单字符数组,并排序(排序可不用)
            //console.log(strs);//这是调试用的
            var counters = [];//定义一个数组来保存字符出现的次数
            for(var i = 0;i<strs.length;i++){//用两个for循环来遍历strs数组内字符出现的次数,用temp计数。
                var temp=0;
                for(var j = 0;j<strs.length;j++){
                    if(strs[i]==strs[j]){
                        temp++;
                    }
                }
                //console.log(strs[i]+":"+temp);//这是调试用的
                if(Array.isArray(counters[temp])){//判断是否数组
                    if(!counters[temp].some(function(elem){//判断数组里面是否有相同元素。
                            return elem==strs[i];
                        }))
                        counters[temp].push(strs[i]);//没有相同元素则push字符到相应的以次数为脚标的二维数组中。
                }else {
                    counters[temp] = [];//不是数组,则定义空数 组。
                    counters[temp].push(strs[i]);//同时push字符到相应的以次数为脚标的二维数组中。主要是第一次push时。
                }
            }
            console.log(counters[counters.length-1]);//那么最后一个二维数组内容就是次数最多的字符,出现的次数就是counters.length-1。
            return counters;
        }
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号