找出字符串中出现最多的字符,和出现的次数?

popsn 2007-05-12 05:57:06
找出字符串中出现最多的字符,和出现的次数。
我现在自已写了请各位帮忙看看,有没有更好的方法,或者指出不足之处。
字符类似:str="abcdefsdfasdfsdfasdad"

<script language="language" type="text/javascript">
var tmpstr="";
var maxvalue=1;
var tmpcount2=0;
function getchar(str)
{
var objstr=new String(str);

for(n=0;n<objstr.length;n++)
{
tmpcount1=0;
for(j=0;j<objstr.length;j++)
{
if(objstr.charAt(n)==objstr.charAt(j))
{
tmpcount1=tmpcount1+1;
tmpcount2=tmpcount1;
}
}
if(maxvalue<tmpcount2)
{
maxvalue=tmpcount2;
tmpstr="出现最多的字符是:"+objstr.charAt(n);
}
else
{
maxvalue=1;
tmpstr="没有得复的字符";
}
}

alert(tmpstr+ " 出现的次数是:" + maxvalue);
}
</script>
...全文
3291 86 打赏 收藏 转发到动态 举报
写回复
用AI写文章
86 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttyp 2007-06-05
  • 打赏
  • 举报
回复
<SCRIPT LANGUAGE="JavaScript">
<!--
var a = "sdfssdfsdfsdfs|||ds()sd$#";
var b = a.split("").sort().join("").replace(/(.?)\1*/g,"$1").split("");
var s = "$()*+.[?\\^{|";

for(var i in b){
var x;
if(s.indexOf(b[i])>=0)
x = new RegExp("\\" + b[i],"g");
else
x = new RegExp(b[i],"g");

var m = a.match(x);
if(m)alert(b[i] + "=" + m.length);
}

//-->
</SCRIPT>
popsn 2007-05-20
  • 打赏
  • 举报
回复
很感谢以上各位的热心发言,结贴了。(由于开贴时分值设得太低,造成部分高手没有分配到分,在此谢过)
muxrwc 2007-05-18
  • 打赏
  • 举报
回复
晕倒。
meizz 2007-05-17
  • 打赏
  • 举报
回复
dh20156 的代码要比你(gzdiablo)的快些,gzdiablo 不是最快的(非正则)
fason 2007-05-17
  • 打赏
  • 举报
回复
呵呵
gzdiablo 2007-05-17
  • 打赏
  • 举报
回复
没事写个不用正则的方法 估计是最快的了
var istr = new Array(6001).join("kwnrwsn1j4k35j54d12oishi43jacisdwsaqairzkenabeiibd");
var ds = new Date();
alert(gzdiablo(istr) + " 时间: " + (new Date()-ds) + "ms");

function gzdiablo(str)
{
var d = str.length;
var count={"key": "", "maxLen":0};
str = str.split("").sort().join("");
while(str.length>0)
{
var s=str.charAt(0);
var li = str.lastIndexOf(s) + 1;
var n = li - str.indexOf(s);
str = str.substr(li);
if(n>count["maxLen"]){count["key"]=s;count["maxLen"]=n;}
}
return("字符:"+ count["key"] +" 次数:"+ count["maxLen"] + " 总字符: " + d);
}
gzdiablo 2007-05-17
  • 打赏
  • 举报
回复
好了用正则的最佳代码已经写好了 有没有人能写个不用正则的最快算法?
dh20156 2007-05-17
  • 打赏
  • 举报
回复
许久不见阿信浮出水面了!
[并列最多],小梅真有想法,呵呵 :)
btbtd 2007-05-17
  • 打赏
  • 举报
回复
晕....JS怎么跟算法整一边了...跳过...
gzdiablo 2007-05-17
  • 打赏
  • 举报
回复
居然没想到
meizz 2007-05-17
  • 打赏
  • 举报
回复
大家可以测试一下,再发挥一下看还有没有更快的代码出现:

<script language="javascript">
var istr = new Array(10001).join("kwnrwsn1j4k35j54d12oishi43jacisdwsaqairzkenabeiibd");
var d=new Date();
alert(mm1(istr) + " 时间: " + (new Date()-d) + "ms");

var d=new Date();
alert(mm2(istr) + " 时间: " + (new Date()-d) + "ms");

function mm1(str) //用正则法
{
var count={"key": "", "maxLen":0}, n;
while((n=str.length)>0)
{
var s=ss=str.charAt(0);
if("^$|\\+?[](.)".indexOf(s)>-1) ss="\\"+ s;
str=str.replace(new RegExp(ss,"g"),"");
n -= str.length; count[s]=n;
if(n>count["maxLen"]){count["key"]=s;count["maxLen"]=n;}
}
return("字符:"+ count["key"] +" 次数:"+ count["maxLen"]);
}
function mm2(str) //不用正则法
{
var t = {}, m=0, n="", l;
while((l=str.length)>0)
{
var s=str.charAt(0);
str=str.split(s).join("");
t[s]=l-str.length;
}
for(i in t){m=Math.max(m, t[i]); if(m==t[i]) n=i;}
return "字符:"+ n +" 次数:"+m;
}
</script>
btbtd 2007-05-16
  • 打赏
  • 举报
回复
长度: 26970
用时: 234 ms

长度: 53590
用时: 469 ms

长度: 123520
用时: 1093 ms
btbtd 2007-05-16
  • 打赏
  • 举报
回复
长度: 26970
用时: 234 ms
btbtd 2007-05-16
  • 打赏
  • 举报
回复
咱也来凑热闹....


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- DW6 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<script type="text/javascript">
//<![CDATA[
onload =
function()
{
var str="abcdefsdfasdfgfajskld;fjaslkfjaskldfjaslkdjfskal;dsdfasdad";

defaultStatus = fGetMaxTime(str);
}

function fGetMaxTime(sIpt)
{
if(sIpt=="")
{
alert("输入字串为空!");
return false;
}
var o = new Object();
sIpt.replace
(
/(\S)/g,
function($1, $2)
{
if($1 in o)
{
o[$1] = o[$1]+1;
}
else
{
o[$1] = 1;
}
}
); // end sIpt.replace

var a = [];
var sTempName = "";

for(var i in o)
{
if(sTempName == "")
{
sTempName = i;
}
else
{
if(o[sTempName]<o[i])
{
sTempName = i;
} // end if 1
} // end if
} // end for

return [sTempName,o[sTempName]];
} // end function fGetMaxTime
//]]>
</script>
</head>
<body>

</body>
</html>
mrshelly 2007-05-16
  • 打赏
  • 举报
回复
MARK

好激烈........
  • 打赏
  • 举报
回复
以前不会用in,也不会计算用时,只会在vbscript中用for each next,现在会用了,修改了一下,自己的程序,也测试了一下,用时0.今天又长见识了
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>求出现最多字符</title>
<script language="javascript">
var ds,de;
ds=new Date();
var strsource="aaaabbbbcccccccccccdfdfdf;djfkldjsafkl;jasd";
var arrchr=new Array();
var i,j,maxcount;
for(i=0,j=0;i<strsource.length;i++){
if(arrchr[strsource.charAt(i)])
arrchr[strsource.charAt(i)]++;
else{
arrchr[strsource.charAt(i)]=1;
}
}

maxcount=0;
var a;
for(a in arrchr){
if(arrchr[a]>maxcount){
maxcount=arrchr[a];
j=a;
}
}

var de =new Date();
alert("maxchar="+j+"\n appearcount="+arrchr[j]);
alert(de.valueOf()-ds.valueOf());
</script>
</head>
<body>
</body>
</html>

  • 打赏
  • 举报
回复
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>求出现最多字符</title>
<script language="javascript">
var strsource="aaaabbbbcccccccccccdfdfdf;djfkldjsafkl;jasd";
var arrchr=new Array();
var appearchar=new Array();
var i,j,maxcount,cchar;
for(i=0,j=0;i<strsource.length;i++){
if(arrchr[strsource.charAt(i)])
arrchr[strsource.charAt(i)]++;
else{
arrchr[strsource.charAt(i)]=1;
appearchar[j++]=strsource.charAt(i);
}
}

for(i=0,maxcount=0,j=0;i<appearchar.length;i++){
if(arrchr[appearchar[i]]>maxcount){
maxcount=arrchr[appearchar[i]];
j=i;
}
}
alert("maxchar="+appearchar[j]+"\n appearcount="+arrchr[appearchar[j]]);
/*if(arrchr[strsource.charAt(1)])
alert("path true");
else
alert("path false");
arrchr[strsource.charAt(1)]=2;
alert(arrchr[strsource.charAt(1)]);
//alert(strsource);*/
</script>
</head>
<body>
</body>
</html>
梅雪香 2007-05-16
  • 打赏
  • 举报
回复
<script type="text/javascript">
<!--
var str = "`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~`1234567890-=\qwertyuiop[]asdfghjkl;'zxcvbnm,./?><\":L}{|+_)(#@QWERTYUIOP[ASSDFGDFGHJKZXCVBNMXCV!!~";
str = "asdfssssss".split("").join(str).split("").join(str);

//-->
</script>

<script type="text/javascript">
<!--
function getChNum(str) {
var vec = {"chs":"","times":0};
var i=0;
while(k=str.length){
i++;
var ch = str.charAt(0);
str = str.replace(new RegExp(".^$[]()|-,{}*+?\\".indexOf(ch)>-1? "\\"+ch:ch,"g"),"");
var num = k - str.length;
if(num > vec["times"]){
vec = {"chs":ch,"times":num}
}else if(num == vec["times"]){
vec["chs"] += "," + ch;
}
}
vec["type"] = i;
return vec;
}

var ds = new Date();
var o = getChNum(str);
var de = new Date();

document.write( "most char : ", o["chs"],"    times :", o["times"], "<BR>");
document.write("strLen: ", str.length + "    runTime: " + (de.valueOf() - ds.valueOf()), "<BR>");
document.write("char types: ", o["type"]);

//-->
</script>


并列最多的字符: [,S,D,F,G,X,C,V,!
字符出现次数 : 112032
字符串长度 : 5433562
运行时间 : 3500 ms
出现的字符种类: 88
gzdiablo 2007-05-16
  • 打赏
  • 举报
回复
这样的查询首选就是正则 肯定比遍历快 至于具体怎么处理那是另一回事了
dh20156 2007-05-16
  • 打赏
  • 举报
回复
大梅要帮偶的代码优化啊!
dh20156:字符:d 次数:299994 时间:5087
meizz:字符:d 次数:299994 时间:301
muxrwc:字符:d 次数:299994 时间:7260

还是正则替换思路快!
加载更多回复(66)

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧