一个字符串str="fsdafdsaf" 任意个字符,求出这个字符串中出现次数最多的字符和出现的次数
这个是一个js的考题,我刚开始接触到这个题的时候第一想法是用数组,然后将数组排序 下面是我的代码,前提是字符串已经被我按照一定顺序排列好了
其次我还想到一个方法就是用 Dictionary 对象 ,但是对这个对象不是很熟悉,所以刚开始并没有想用这个,不过当发现上面的路走不通的时候,就决定用这个来搞了.通过查阅api,发现并不是很复杂,下面直接上代码:
这个看起来是不是清晰的多了 呵呵,只是我是这么认为的.同时这个问题被我发到群里讨论,群里兄弟给出了另外一个代码,也是使用数组排序的方式,不同的是他用的正则,以下是他的代码
群里还有一个朋友给出了他的代码
代码如下:
这个代码在这里str.split(tempLetter).length;会出现问题,但是我这里说的是思路,他的这个是另外一种思路.
OK就总结到这里吧.
还有一个在这里贴一下,以后警示自己不要犯类似的错误:
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();
}
}
}
当然这个代码没有调通就被我放弃了 ,感觉太繁琐了.放到这里只是为了说明下我的思路.{ 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);
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();
这个代码给我的感觉就是简洁,的确写的很漂亮 这个不由让我想到上一篇博文中我也提到正则能给我们省很多事情,让我们的程序更加简洁.以后要多学习正则啊 呵呵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);
}
{
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 是并且的关系,才知道原来是或者的关系,你知道么?呵呵
for(i=0;i<6,j<10;i++,j++)
{
k = i+j;
//alert("i"+i);
//alert("j"+j);
}
alert(k);