扫码关注官方订阅号
我的思路是:循环比较取出相同的字符,如果相同则次数自加。但是不知道哪里错了。现在的运行结果是每个字符出现的次数的累加和。。。代码如下:
无标题文档 获取
欢迎选择我的课程,让我们一起见证您的进步~~
把中间的部分换成下面这样,原因是每次循环的时候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('我爱北京天安门,天安门上太阳升') // ["天", "安", "门"]
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; }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
把中间的部分换成下面这样,原因是每次循环的时候temp没有初始化,另外最后alert的应该是count吧...
es6es5给你个优雅点和效率点的方案吧
当然了,一眼看过去就知道,其实正确的答案应该是“天安门”三个字都是最大频次的字符,目前的逻辑只能输出第一个,如果要输出这所有频次相同的最大频次字符,还需要稍微做一些改进
细想了一下,给个思路:
先将字符串排序,然后循环计算每个字符出现的次数,并将出现相同次数的值放在以次数为索引的缓存数组中,然后,缓存数组的最后项即为出现次数最多的字符串数组;
即如:
测试结果如下: