我的思路是:循环比较取出相同的字符,如果相同则次数自加。但是不知道哪里错了。现在的运行结果是每个字符出现的次数的累加和。。。
代码如下:
<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>
给你个优雅点和效率点的方案吧
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);
当然了,一眼看过去就知道,其实正确的答案应该是“天安门”三个字都是最大频次的字符,目前的逻辑只能输出第一个,如果要输出这所有频次相同的最大频次字符,还需要稍微做一些改进
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'
先切割字符串为数组,然后遍历产生字典,再根据出现次数排序,最后输出出现最多的字符数组,代码如下:
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
把中间的部分换成下面这样,原因是每次循环的时候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);
细想了一下,给个思路:
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('我爱北京天安门,天安门上太阳升')
// ["天", "安", "门"]
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]
}