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

这个是一个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 是并且的关系,才知道原来是或者的关系,你知道么?呵呵
la...la......la............
posted @ 2008-07-11 19:11 雨中漫步的太阳 阅读(1289) 评论(8)  编辑 收藏

  回复  引用    
#1楼 2008-07-11 19:40 | gaga [未注册用户]
var str="dasfdsafd";
var counters = [];
var max = 0;
for(var i=0;i<str.length;i++)
{
var charCode = charCodeAt(i);
counters[charCode] = counters[charCode]? 1 : (counters[charCode]+1);
if(counters[charCode]>max)
max = counters[charCode];
}
var theChar = string.fromCharCode(max);//出现最多的字符.
  回复  引用  查看    
#2楼 2008-07-11 20:26 | BoyLee      
路过,顺便求教
为什么任意字符串.IndexOf("〇")=0?
IL_0009: ldstr bytearray (07 30 ) // .0

  回复  引用  查看    
#3楼 2008-07-11 20:55 | 无常      
c#中用linq试下
string str = "abkfjdskfjdskafdsjhfjA9aaaaaaaaaaaaaaaaa";
char[] chrs = str.ToCharArray() ;
var q = from o in chrs
group o by o into g
orderby g.Count() descending
select new { Char = g.Key, Count = g.Count() };
foreach (var item in q)
{
Console.WriteLine("char:{0} = {1}", item.Char, item.Count);
}


结果
char:a = 19
char:f = 4
char:j = 4
char:k = 3
char:d = 3
char:s = 3
char:b = 1
char:h = 1
char:A = 1
char:9 = 1

  回复  引用  查看    
#4楼 2008-07-11 21:54 | Anders Liu      
用linq算耍赖。。。。
  回复  引用  查看    
#5楼 [楼主]2008-07-11 22:15 | 雨中漫步的太阳      
--引用-------------------------------------------------- gaga: var str="dasfdsafd"; var counters = []; var max = 0; for(var i=0;i<str.length;i++) { var charCode = charCodeAt(i); counters[charCode] = counters[charCode]? 1 : (counters[charCode]+1); if(counters[charCode]>max) max = counters[charCode]; } var theChar = string.fromCharCode(max);//出现最多的字符. --------------------------------------------------------
这个算是一种思路,不过代码需要修改后才能调试通过
  回复  引用  查看    
#6楼 2008-07-13 00:50 | 静静的黎明      
以前做过c#版的,因为计算相当频繁,所以没用正则或者集合类。
只循环一次。 回忆思路写个js版的
<script language="javascript">
var str = "abkfjdskfjdskafdsjhfjA9x";
var arr = str.split("").sort();
var char = arr[0];
var count = 1;
var coll = new Object();
for(var i = 1, len = arr.length; i < len; i++)
{
var notEnd = i < (len - 1);
if(arr[i] == char)
{
count++;
if(notEnd) continue;
}
coll[arr[i - 1]] = count;
char = arr[i];
count = 1;
if(!notEnd && arr[i] != arr[i - 1])
coll[arr[i]] = 1;
}
//输出结果
for(var key in coll)
{
document.write("<br/>char=" + key + ";count=" + coll[key]);
}
</script>
  回复  引用  查看    
#7楼 2008-07-13 01:01 | 静静的黎明      
说到c#,用个object来做hash表,应该更方便
<script language="javascript">
var str = "abkfjdskfjdskafdsjhfjA9x";
var coll = new Object();
for(var i = 0; i < str.length;i++)
{
var char = str.charAt(i);
if(coll[char])
coll[char] = parseInt(coll[char]) + 1;
else
coll[char] = 1;
}
for(var key in coll)
{
document.write("<br/>char=" + key + ";count=" + coll[key]);
}
</script>
  回复  引用    
#8楼 2008-07-30 23:19 | SK_Bogdan [未注册用户]
1楼答案时间复杂度最小,尤其当字符串规模大的时候.因为字符的取值范围是确定的,所以可以引入计数排序的思想.这是典型的用空间换时间的办法.用Hash的话空间规模与数组相比不敢恭维.

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: