现在的位置: 首页 > 综合 > 正文

一个字符串str=”fsdafdsaf” 任意个字符,求出这个字符串中出现次数最多的字符和出现的次数

2012年09月05日 ⁄ 综合 ⁄ 共 2465字 ⁄ 字号 评论关闭
这个是一个js的考题,我刚开始接触到这个题的时候第一想法是用数组,然后将数组排序 下面是我的代码,前提是字符串已经被我按照一定顺序排列好了
function check() 
if(newstr.length>0
{ tempstr = newstr.charAt(0); 
tempnum
=nextstart = newstr.lastIndexOf(tempstr)+1
if(nextstart<newstr.length) 
{ maxstr = newstr.charAt(nextstart); 
maxnum 
= newstr.lastIndexOf(maxstr)+1-nextstart; 
if(tempnum>maxnum) 
{ maxnum = tempnum; maxstr = tempstr; } 
newstr
=newstr.substr(nextstart); 
  check(); 
}
 
}

}

当然这个代码没有调通就被我放弃了 ,感觉太繁琐了.放到这里只是为了说明下我的思路.
其次我还想到一个方法就是用 Dictionary 对象 ,但是对这个对象不是很熟悉,所以刚开始并没有想用这个,不过当发现上面的路走不通的时候,就决定用这个来搞了.通过查阅api,发现并不是很复杂,下面直接上代码:

var str = "abkfjdskfjdskafdsjhfjA9aaaaaaaaaaaaaaaaa";
    
var dir = new ActiveXObject("Scripting.Dictionary");
    
for(i=0;i<str.length;i++)
    
{
        tmp 
= str.charAt(i);
        
if(!dir.Exists(tmp))
        
{
            dir.add(tmp, 
1);

        }
else{
            num 
= dir.Item(tmp)+1;
            dir.Remove(tmp);
            dir.add(tmp,num);
        }

    }

   a 
= (new VBArray(dir.Keys()));   
   maxstr 
="";
   maxnum 
=0;
   
for (i = 0; i < dir.Count; i++)   
   
{
      
if(dir(a.getItem(i)) > maxnum)
      
{
        maxnum 
= dir(a.getItem(i));
        maxstr 
= a.getItem(i);    
      }
    
      
else
      
if(dir(a.getItem(i)) == maxnum)
      
{        
        maxstr 
=maxstr +" and "+ a.getItem(i);    
      }
      
     
   }

   alert(maxstr
+":"+maxnum);

这个看起来是不是清晰的多了 呵呵,只是我是这么认为的.同时这个问题被我发到群里讨论,群里兄弟给出了另外一个代码,也是使用数组排序的方式,不同的是他用的正则,以下是他的代码

 function clac() {
    
var dest_char;
    
var index = -1;

    
var str = "abkfjdskfjdskafdsjhfjA9";
    
var arr = str.split("");
    arr.sort();
    str 
= arr.join("").toString();
    str.replace(
/(\w)(\1)+/g,function($0,$1,$2){
        
if($0.length > index){
            index 
= $0.length;
            dest_char 
= $1;
        }

    }
)

    alert(
"dest_char:"+dest_char + "\n" + "index: " + index);
}
 
 clac();

这个代码给我的感觉就是简洁,的确写的很漂亮 这个不由让我想到上一篇博文中我也提到正则能给我们省很多事情,让我们的程序更加简洁.以后要多学习正则啊 呵呵
群里还有一个朋友给出了他的代码
代码如下:

function showMax(str)
{
var temp = str;
var curNum = 0;
var curLetter = "";
while (temp != "")
{
var tempLetter = temp.substring(0,1);
var tempNum = str.split(tempLetter).length;
if(tempNum > curNum) // 未判断相等时
{
curNum 
= tempNum;
curLetter 
= tempLetter;
}

temp 
= temp.substring(1);
}

alert(
"CurLetter:" + curLetter + "  CurNum:" + curNum);

}
 

这个代码在这里str.split(tempLetter).length;会出现问题,但是我这里说的是思路,他的这个是另外一种思路.
OK就总结到这里吧.
还有一个在这里贴一下,以后警示自己不要犯类似的错误:

var i=0,j=0,k=0;
    
for(i=0;i<6,j<10;i++,j++)
    
{
        k 
= i+j;
        
//alert("i"+i);
        //alert("j"+j);
    }

    alert(k);

一直以为for循环中i<6,j<10 是并且的关系,才知道原来是或者的关系,你知道么?呵呵

抱歉!评论已关闭.