我的程序:长度:15120 用时 78ms
你的程序:长度:904 用时 9016ms
function getChNum(str){
var vec = {};
for(var i=0,j=str.length;i<j;i++){
var ch = str.charAt(i);
if(vec[ch]) continue;
var reg = new RegExp(ch,"g");
var ar = str.match(reg);
if(ar) vec[ch] = ar.length;
//alert(ar.length);
}
var maxtimes = 0;
var maxch = "";
for(var p in vec)
if(vec[p] > maxtimes){
maxtimes = vec[p];
maxch = p;
}
return { "times":maxtimes, "charater":maxch};
}
var ds = new Date();
var o = getChNum(str)
var de = new Date();
document.write(o["times"]," " , o["charater"]);
prompt("",str.length + " time is " + (de.valueOf() - ds.valueOf()));

解决方案 »

  1.   

    估计是俺的小黑速度太快,用时 0ms!哈L@_@K!  <script type="text/javascript">
      <!--
    var ds = new Date();
    var str = "abcdefsdfasdfsdfasdad";
    var strChar;
    var numMax =  0;
    var oCount = new Object();
    for (var i=0; i<str.length; i++)
    {
        if (oCount[str.charAt(i)] == undefined) oCount[str.charAt(i)] = 0;
        oCount[str.charAt(i)] += 1;
    }
    for (var a in oCount)
    {
        if (oCount[a] > numMax)
        {
            numMax = oCount[a];
            strChar = a;
        }
    }
    var de = new Date();
    document.write("Timespan: " + (de.valueOf() - ds.valueOf()) + "ms."); // Timespan: 0ms.
    alert(strChar + " : " + numMax); // d : 6
      //-->
      </script>
      

  2.   

    没注意长度,抱歉抱歉!测了一下:zhaoxiaoyang(梅雪香@深圳)
    Length: 15000
    Timespan: 157ms. 俺的:
    Length: 15000
    Timespan: 187ms. 俺的虽然效率略低,但是代码短又易读!LZ 自选,哈
      

  3.   

    LZ 的代码还有逻辑错误,如下,else 应该注释掉!   if(maxvalue<tmpcount2)
      {
    maxvalue=tmpcount2;
    tmpstr="出现最多的字符是:"+objstr.charAt(n);
      } 
    //    else
    //    {
    //  maxvalue=1;
    //  tmpstr="没有得复的字符";
    //    }
      

  4.   

    其实我当时是没有加else的,后来发现假如所有字符都(不相同)怎办,所以发贴时加上,没有做严密测试造成。很感谢楼上的两边朋友的热心。
      

  5.   

    var ds = new Date(); //开始计时
    var o = getChNum(str) ; //被计时的程序
    var de = new Date();//计时结束
    de.valueOf() - ds.valueOf() 就是程序运行的毫秒数了
      

  6.   

    <script type="text/javascript" language="javascript">var str="a121adakshdkjashdl2";
    alert(test(str));
    function test(str)
    {
    if(str=="")return "";
    var max=0;
    var rs="";
    while(true)
    {
    var ls=str.length;
    var ch=str.charAt(0);
    var reg=new RegExp(ch,"g");
    str=str.replace(reg,"");
    var rps=ls-str.length;
    rs += max==rps?ch+":"+max+"\n":"";
    rs =  rps > max?ch+":"+rps+"\n":rs;
    max = rps > max?rps:max;
    if(!str)break;
    }
    return rs;
    }
    </script>
      

  7.   

    你的程序忽略了输出的时间统计。就是Document.write......
      

  8.   


    <script type="text/javascript" language="javascript">var str1="abcdefsdfasdfsdfasdad";
    var str="";
    for(var i=0;i<15000;i++)
    str+=str1;
    alert(test(str));
    function test(str)
    {
    var ds = new Date(); //开始计时
    if(str=="")return "";
    var max=0;
    var rs="";
    while(true)
    {
    var ls=str.length;
    var ch=str.charAt(0);
    var reg=new RegExp(ch,"g");
    str=str.replace(reg,"");
    var rps=ls-str.length;
    rs += max==rps?ch+":"+max+"\n":"";
    rs =  rps > max?ch+":"+rps+"\n":rs;
    max = rps > max?rps:max;
    if(!str)break;
    }
    return (new Date()-ds)+"ms\n"+rs;
    }
    </script>不算字符串生成的时间
    我这里62ms
      

  9.   

    改了下zhaoxiaoyang(梅雪香@深圳) 的
    <script type="text/javascript" language="javascript">var str1="abcdefsdfasdfsdfasdad";
    var str="";
    for(var i=0;i<15000;i++)
    str+=str1;
    alert("start");
    alert(getChNum(str));
    function getChNum(str)
    {
    var ds = new Date();
    var vec = {};
    for(var i=0,j=str.length;i<j;i++){
    var ch = str.charAt(i);
    if(vec[ch]) continue;
    var reg = new RegExp(ch,"g");
    var ar = str.match(reg);
    if(ar) vec[ch] = ar.length;
    }
    var maxtimes = 0;
    var maxch = "";
    for(var p in vec)
    if(vec[p] > maxtimes){
    maxtimes = vec[p];
    maxch = p;
    }
    alert(new Date()-ds+"ms");
    return { "times":maxtimes, "charater":maxch};
    }
    <script>
    不算字符串生产时间,要7187ms
      

  10.   

    又快了一点
    字符 : a        出现次数 :20000
    字符串长度: 100,000        运行时间: 203 毫秒
    <script type="text/javascript">
    <!--
    var str = "abcdefghia";
    var i = 14;
    while(i--)
        str += str;
    str = str.substring(63840);var vec;
    function getChNum(str) {
        vec = {};
        while(str.length){
            var k=0;
            var ch = str.charAt(0);
            var reg = new RegExp(ch,"g");
            vec[ch] = str.match(reg).length;
            str = str.replace(reg,"");
        }
        var maxtimes = 0;
        var maxch = "";
        for (var p in vec) {
            if (vec[p] > maxtimes) {
                maxtimes = vec[p];
                maxch = p;
            }
        }
        return {"times":maxtimes, "charater":maxch};
    }var ds = new Date();
    var o = getChNum(str);
    var de = new Date();
    for (var p in vec) {
        document.write(" char : ", p, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times:", vec[p], "<BR>");
    }
    document.write( "most char : ", o["charater"],"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times :", o["times"], "<BR>");
    document.write("strLen: ", str.length + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runTime: " + (de.valueOf() - ds.valueOf()));//-->
    </script>
      

  11.   

    var str = "abcdefghia";
    var i = 17;
    while(i--)
        str += str;
    str = str.substring(310720);most char : a        times :200000
    strLen: 1000000        runTime: 2172
      

  12.   

    偶的支持最大相同重复输出的
    "aabb"ls只能找出a
    b查不到的把
    ls的不支持哦
      

  13.   

    <script type="text/javascript">
    <!--
    var str = "abbeefghia";
    var i = 17;
    while(i--)
        str += str;
    str = str.substring(310720);var vec;
    function getChNum(str) {
        vec = {};
        while(str.length){
            var k=0;
            var ch = str.charAt(0);
            var reg = new RegExp(ch,"g");
            vec[ch] = str.match(reg).length;
            str = str.replace(reg,"");
        }
        var maxtimes = 0;
        var maxch = "";
        var ar = [];
        for (var p in vec) {
            if (vec[p] > maxtimes) {
                maxtimes = vec[p];
                maxch = p;
            }
        }
        for (var p in vec) {
            if(vec[p] == maxtimes)
                ar.push(p);
        }
        return {"times":maxtimes,"chs":ar};
    }var ds = new Date();
    var o = getChNum(str);
    var de = new Date();
    for (var p in vec) {
        document.write(" char : ", p, "&nbsp;&nbsp;&nbsp;&nbsp;times:", vec[p], "<BR>");
    }
    document.write( "most char : ", o["chs"],"&nbsp;&nbsp;&nbsp;&nbsp;times :", o["times"], "<BR>");
    document.write("strLen: ", str.length + "&nbsp;&nbsp;&nbsp;&nbsp;runTime: " + (de.valueOf() - ds.valueOf()));//-->
    </script>
      

  14.   

    codeworker999和小梅的方法都挺好的,不过codeworker999的方法有很大缺点,原因就在于数据的相似度上,如果15000个字符全部不一样,你的方法会把浏览器弄死掉,小梅的程序和999的都用了大循环多次匹配。
    codeworker999程序的BUG例子(注意这个程序会死掉浏览器,调试的时候小心)
    <script language=javascript>
    var str=""
    function find()
    {
    var ds = new Date(); //开始计时
    if(str=="")return "";
    var max=0;
    var rs="";
    while(true)
    {
    var ls=str.length;
    var ch=str.charAt(0);
    var reg=new RegExp(ch,"g");
    str=str.replace(reg,"");
    var rps=ls-str.length;
    rs += max==rps?ch+":"+max+"\n":"";
    rs =  rps > max?ch+":"+rps+"\n":rs;
    max = rps > max?rps:max;
    if(!str)break;
    }
    alert((new Date()-ds)+"ms\n"+rs);
    }function init()
    {
    var tempArray=new Array()
    var num=document.getElementById("num").value
    var numValue="";
    for(var i=0;i<num;i++)
    {
    tempArray[i]=String.fromCharCode(i)
    }
    str=tempArray.join("");
    document.getElementById("textarea1").value=str
    }
    </script>
    <input name="button1" type="button" onclick=init() value="初始化">
    <input name="button1" type="button" onclick=find() value="查找">
    <input name=num value="15000">
    <textarea id="textarea1">
    </textarea>
    我的程序虽然在正常情况比999的要慢,但是相似度大的时候速度差不多,比小梅的速度要快一些
    <script language=javascript>
    var str=""
    function find()
    {
    var ds = new Date();
    var maxNum=0;
    var temp=new Object();
    str.replace(/[\s\S]/g,function(a){if(!temp[a])temp[a]=0;if(temp[a]++>maxNum)maxNum=a})
    var de = new Date();
    alert(str.length + " time is " + (de.valueOf() - ds.valueOf()));
    alert ("times="+temp[maxNum]+"charater="+maxNum);
    }function init()
    {
    var tempArray=new Array()
    var num=document.getElementById("num").value
    var numValue="";
    for(var i=0;i<num;i++)
    {
    tempArray[i]=Math.floor(Math.random()*10)
    }
    str=tempArray.join("");
    document.getElementById("textarea1").value=str
    }
    </script>
    <input name="button1" type="button" onclick=init() value="初始化">
    <input name="button1" type="button" onclick=find() value="查找">
    <input name=num value="15000">
    <textarea id="textarea1">
    </textarea>
      

  15.   

    总而言之,言而总之呢,算法没有万能的,都有一定的适用范围
    天外的方法是最实在的,一个字符一个字符的处理,出现过就加一,没出现过就设为1.
    缺点也在于此,在function中,要处理一次取反,两次判断,一次比较,一次赋值,一次加法,所以导致程序较慢.
    我的程序对于高重复性的字符串较有优势,利用正则匹配功能,而且for循环的次数等于出现的字符个数(不重复), 如果用了abcd四个字符,那么只循环四次.如果处理一百万的ascii字符串,天外的算法可能要导致浏览器不响映的.而我的算法可以在几秒左右算完. 对于完全不重复的一百万长度字符串,估计谁的算法都够呛,这是语言问题了. 不过,一百万不重复的字符串,得多少种语言拼出来的啊! 估计还没谁遇到过.
      

  16.   

    偶的bug是没有正则中的特殊字符
    <script language=javascript>
    var str=""
    function find()
    { var ds = new Date(); //开始计时
    if(str=="")return "";
    var max=0;
    var rs="";
    var pos=0;
    alert(str.length);
    var t="$()*+.[]?\\^{}|";
    while(true)
    {
    var ls=str.length;
    var ch=str.charAt(0);
    ch=t.indexOf(ch)>=0?"\\"+ch:ch;
    str=str.replace(new RegExp("["+eval("ch")+"]","g"),"");
    var rps=ls-str.length;
    rs += max==rps?ch+":"+max+"\n":"";
    rs =  rps > max?ch+":"+rps+"\n":rs;
    max = rps > max?rps:max;
    if(!str)break;
    }
    alert((new Date()-ds)+"ms\n")//+rs);
    }function init()
    {
    var tempArray=new Array()
    var num=document.getElementById("num").value
    var numValue="";
    for(var i=0;i<num;i++)
    {
    tempArray[i]=String.fromCharCode(i);
    }

    str=tempArray.join("");
    document.getElementById("textarea1").value=str
    }
    </script>
    <input name="button1" type="button" onclick=init() value="初始化">
    <input name="button1" type="button" onclick=find() value="查找">
    <input name=num value="15000">
    <textarea id="textarea1" style="width:500;height:500">
    </textarea>
    去掉后 就没问题
    但是如果不重复,速度上不去,要5000-6000ms
      

  17.   

    function mm(str)
    {
      var count={"length":0};
      while(str.length>0)
      {
        var n=str.length;
        var s=str.charAt(0);
        str=str.replace(new RegExp(s,"g"),"");
        n -= str.length;
        if(n>count.length){count["key"]=s;count["length"]=n;}
      }
      alert("字符:"+ count["key"] +" 次数:"+ count["length"]);
    }var str="abcdefsdfasdfsdfasdad";
    mm(str);
      

  18.   

    meizz(梅花雪)  n -= str.length; 这句学习了!
      

  19.   

    梅老大这个有点问题就是不能找特殊字符
    var str="abcdefsdfasdfsdfasd|||||||||||||||||||ad";
    就挂了
      

  20.   

    夏天,大梅老大的那段程序 我也在看这个问题,我试过
    aaa\
    \
    \
    \
    \
    \ddd
    这样的字符串也找不出来
    正想办法呢
      

  21.   

    这个去掉正则的元字符了
    function find(str)
    {
    var ds = new Date(); //开始计时
    if(!str)return "";
    var max=0;
    var slen,ch,tmp,rs;
    var reg=new RegExp();
    //var t="$()*+.[]?\\^{}|";
    while(str)
    {
    slen=str.length;
    ch=str.charAt(0);
    tmp=ch.replace(/([\\$()*+.\[\]?\^{}\|])/g,"\\$1");
    str=str.replace(reg.compile(tmp, "g"),"");
    slen -= str.length;
    rs += max==slen?ch+":"+max+"\n":"";
    rs =  slen > max?ch+":"+slen+"\n":rs;
    max = slen > max?slen:max;
    }
    alert((new Date()-ds)+"ms\n");
    //alert((new Date()-ds)+"ms\n"+rs);
    }
      

  22.   

    牛人比较多.....提个建议,大家写代码的时候能不能规范一点,该退格的时候退格啊,不要都left....看得我眼睛花,不知道那块是那块....写代码要模块化,不仅程序逻辑模块化,代码的表现形式也要模块花哦....
      

  23.   

    function mm(str)
    {
      var count={"length":0};
      while(str.length>0)
      {
        var n=str.length;
        var s=str.charAt(0);
        str=str.replace(new RegExp("\\"+ s,"g"),""); //稍微改造一下就OK了
        n -= str.length;
        if(n>count.length){count["key"]=s;count["length"]=n;}
      }
      alert("字符:"+ count["key"] +" 次数:"+ count["length"]);
    }var str="abcdefsdfasdfsdfasdad";
    mm(str);
      

  24.   

    梅老大.这样也不行吧var str="abcdefsdfasdfsnnnnnnnnnnnnttttttttttttttttttdfasdad";
    这样的怎么办
      

  25.   

    to:hbhbhbhbhb1021(天外水火(我要多努力)) ( )直接加出问题的
      

  26.   

    sorry!<script type="text/javascript">
    function mm(str)
    {
      var count={"key": "", "maxLen":0};
      while(str.length>0)
      {
        var n=str.length;
        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;}
      }
      alert("字符:"+ count["key"] +" 次数:"+ count["maxLen"]);
    }var str="|abcde'\"\\[]{}-()fd\n\nfasdfsdfasd||||||||||||||||||ad";
    mm(str);
    </script>
      

  27.   

    呵呵用了indexOf
    我还掉在正则里面想着复杂的处理
      

  28.   

    我也写一个献丑,争个效率最低的写法哈~~
    <script language="JavaScript">
    function _0009(str)
    {
        var re = /(.)(?!.*\1)/g;
        var tmp;
        var chr = ""
        var len = str.length;
        while ((tmp = re.exec(str)) != null)
        {
            var l = str.replace(new RegExp(("^$|\\+?[]()".indexOf(tmp[0]) == -1 ? "" : "\\") + tmp[0], "g"), "").length;
            if(l < len)
            {
                len = l;
                chr = tmp[0];
            }
        }
        document.write(chr + ", " + (str.length - len));
    }
    _0009("abbbbnncasdfbbnnnwqetbb||||w|||nneqtssssnnnnnnnnsswqet");
    </script>
      

  29.   

    用最基本的思路有什么不好的:<script>
    function mm(str)
    {
    var charArray=str.toUpperCase().split("");
    var lengthMap=new Array();
    for(var i=charArray.length;i>-1;i--){
    (lengthMap[charArray[i]]++) || (lengthMap[charArray[i]]=1);
    }
    var key='';
    var max=0;
    for(var i in lengthMap){
    if(lengthMap[i]>max) {key=i;max=lengthMap[i];}
    }
      alert("字符:"+ key +" 次数:"+ max);
    }var str="abcdefsfasdfsdfasdad";
    mm(str);</script>