读书人

web前端笔试一路面试题目新解

发布时间: 2012-11-07 09:56:10 作者: rapoo

web前端笔试一道面试题目新解
算出字符串中出现次数最多的字符是什么,出现了多少次
据说是百度的,个人认为百度公司的题目没有这么简单
这不知道是哪位网友给出的回答,答案是对的,但显然不要这么复杂!!



我的解答:
alert("asdfsooafwqefwefvl;zxkjv;lxcvj;ljslfasjowqincvowqnvphsdfohbonodujsdaopfijwqoeifjwef".split("").sort().join("").replace(/(.)\1*/g,function(t){return t.length+"@"+t.charAt(0)+"\0"}).split("\0").sort(function(a,b){return a.split("@")[0]>b.split("@")[0]?-1:1}).join(",").replace(/(\d+)@.(,\1@.)*/g,function(t) {return t.split("@")[0]+"@"+t.replace(/,?\d+@/g,"")}).split(/,\d+@/g)[0].replace(/(\d+)@(.+)/,function(t,a,b) {return "最多的字符为:"+b.split("").join("、")+",共"+a+"个";}));

结果是:
最多的字符为:f、o,共9个 19 楼 drcjian 2010-12-10 把字符串放到hashtable中(字符串作为主键,添加的时候遇到已经存在的主键则改变其值,否则重新添加) 20 楼 z_joey 2010-12-10 用正则表达式的那个算法效率太低了吧 21 楼 liuzhiqiangruc 2010-12-10 针对该问题,有两种解法,无非就是时间和空间的权衡,在实际应用中根据具体情况而定,具体代码就不写了,分析如下,感兴趣的欢迎PK。

第一种解法,牺牲时间换取空间,具体做法是:
1,首先对字符串进行排序,这一步的时间复杂度是固定的。可以有多种排序算法选择。
2,扫描排序后字符串,并且统计遇到的每个字符的数量。方法为:如果下一个字符和当前字符不一致,则当前统计到的数据就是该字符在字符串中出现的次数,此时拿该数据与之前出现过的最大的数据进行比较。
3,扫面结束之后即可以得到出现次数最多的字符,以及出现的次数。
在此过程中空间复杂度为:3,排序时候的空间复杂度为1,扫描阶段需要记录当前字符,当前字符出现的次数,以及曾经出现的最多字符的出现次数。


第二种解法,牺牲空间换取时间,具体做法是:
1,不排序,直接扫描字符串,每遇到一个之前没遇到的字符就把它记下来,并设置其出现的次数为1,如果之前出现,则将该字符的出现次数加1.
2,在每扫描一个字符,并且得到该字符出现的次数时,就与最大的一个次数比较,得到新的最大的次数和字符。
3,扫描结束之后也就得到了结果

这个过程中只需要遍历字符串一次,时间复杂度是线性的,空间复杂度为(字符串中出现的不同的字符串的次数+1)*2.

--有疑问请继续跟帖。

22 楼 liuzhiqiangruc 2010-12-10 z_joey 写道用正则表达式的那个算法效率太低了吧

哪种用正则的方式也不失为一种好方法,是一种不错的思路。 23 楼 flyer646 2010-12-13 楼主 的效率低 (网友给的效率高一些,每个字符只做一次) 假如这个字符串很长的话 你循环就很多次 ,

读书人网 >Web前端

热点推荐