js统计字符串中出现次数最多的字符?

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

<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>
阅读 10.9k
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]
}
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'

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏