重复字符的统计的几个方法如下:
//类似count3,也是使用正则匹配重复的字符,然后根据个数也就是数组长度去排序。 String.count1 = function(str){ var t = str.split("") .sort() .join("") .replace(/((.)\2*)/g,"$1,") .split(",") .sort(function(a,b){return b.length - a.length}); return "字符:"+t[0][0]+"次数:"+t[0].length; } //键-值的思考方法,数组的索引作为“字符”,该索引下的数组值作为“字符个数” String.count2 = function(str){ var map={},maxCount=0,maxChar,undefined,i=str.length; while(i--){ var t = str.charAt(i); map[t] == undefined ? map[t] = 1 : map[t] += 1; if(map[t] > maxCount){ maxChar = t; maxCount = map[maxChar]; } } return "字符:"+maxChar+"次数:"+maxCount; } String.count3 = function(str){ var most = str.split('').sort().join('').match(/(.)\1*/g); //排列重复字符 most = most.sort(function(a,b){return a.length - b.length}).pop();//按出现频繁排序 return most.length + ': ' + most[0]; } //json的思考方法,也是键值映射 String.count4 = function(str) { var s = str.split(''), o ={}, a=[]; for(var i = 0; i < s.length; i++) o[s[i]] ? o[s[i]]++ : o[s[i]]=1; //记录数目 for(var key in o) a[o[key]] ? a[o[key]].push(key) : a[o[key]] = [key]; //取出 return a.length - 1 + ': ' + a.pop(); } String.count5 = function (str){ var most = [], num = 0; while( str != '' ){ var ori = str, target = str.substr(0,1), //目标字符 re = target; if(/[\$\(\)\*\+\.\?]/.test(target)) re = '\\' + re; str = str.replace(new RegExp(re, 'g'), ''); diff = ori.length - str.length; //计算目标字符数目 if(diff > num) { num = diff; most = [target]; } else if (diff == num) { most.push(target); } } return num + ': ' + most; } String.count6 = function (str) { var o ={}, most=0, most_c=[], i=-1, len=str.length, c=str.split(""); i=-1; while (++i < len){ var n = o[c[i]] = (o[c[i]] | 0) + 1; if (n > most){ most_c = [c[i]]; most = o[c[i]]; } else if (n == most) {most_c.push(c[i])} } return most + ': ' + most_c; }
不知道看懂了没有,总结了下,主要思维就是两种:
1:直接用正则匹配重复的字符,然后根据字符个数排序,从大到小,还是从小到大,自己喜欢,然后输出第一个或者最后一个数组元素即可
2:键-值映射存储。对于数组来说,一个索引,一个值,索引存储字符,值存储个数。通过比较值的大小,去存储最大的那个子数组(里面有重复的字符),然后输出。