今天看到一道题,搜索出字符串中出现次数最多的字符,并统计其次数,就自己动手写一下,是用递归来实现的,原理是这样的:每一次都取出字符串STR的第一个字符FS,统计出其在字符串STR中出现的次数N,然后把字符串STR中的FS删除,一直到字符串STR的长度小于N。
1
var
str
=
"
aaaa13123aass123123121sssssddd123d1231231dddd
"
;
2
var
fs
=
""
;
//
保存出现次数最多的字符
3
var
n
=
0
;
//
保存次数
4
function
fineStr(s,n,fs){
5
var
f
=
s.match(
/
^.
/
)[
0
];
//
取出串的第一个字符
6
var
rf
=
new
RegExp(f,
"
g
"
);
//
生成以第一个字符为内容的正则表达式
7
var
nn
=
s.match(rf).length;
//
利用match方法统计出出现的次数
8
if
(nn
>
n){fs
=
f;n
=
nn}
//
如果大于当前次数,则更新字符和次数
9
s
=
s.replace(rf,
""
);
//
清除串中所有当前字符
10
if
(s.length
<
n){
return
[n,fs];}
//
退出条件
11
return
fineStr(s,n,fs);
//
递归
12
}
13
14
var
ar
=
fineStr(str,n,fs);
15
alert(ar);
上面的代码还一个问题,就是如果出现最多的字符不是一个,而是有几个时,只能查找出第一个出现的字符,下面的代码是经过修改后的,会找出所有出现次数最高的字符
01 | function fineStr(s,n,fs){ |
02 | var f=s.match(/^./)[0]; |
03 | var rf= new RegExp(f, "g" ); |
04 | var nn=s.match(rf).length; |
06 | if (nn>n){fs=[];fs.push(f);n=nn} |
08 | if (s.length<n){ return [ "出现次数最多的字符是:" +fs.join( "," ), "总次数为:" +n];} |
09 | return fineStr(s,n,fs); |
12 | var str= "23234kjafh328akdjfh9238442" ; |
13 | alert(fineStr(str,0,[])); |