重复字符的统计 - 从网上总结来的几种方法

前些天去面试,碰到了比较基础的js题:“重复字符的统计”,一下子没能写出来。毕竟是个初学者,基础甚是差呀,对算法掌握又不好。

回家就恶补了下,从网上总结了几个方法如下:

//类似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:键-值映射存储。对于数组来说,一个索引,一个值,索引存储字符,值存储个数。通过比较值的大小,去存储最大的那个子数组(里面有重复的字符),然后输出。

转载于:https://www.cnblogs.com/ilexcai/archive/2011/09/03/2165471.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值