锁定老帖子 主题:面试题目
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-04
论坛里面好像有这个问题 并且有解答!!!
呼呼 |
|
返回顶楼 | |
发表时间:2009-08-05
倾向于lczheng的算法,算法复杂度最低,只需要一次循环。
改进:用数组而非Map存储。 |
|
返回顶楼 | |
发表时间:2009-08-05
ITChaser说到得改进是什么意思呢?能否贴上代码
|
|
返回顶楼 | |
发表时间:2009-08-05
看了大家的实现,好像都没有处理有多个相同最大值的情况哦!
|
|
返回顶楼 | |
发表时间:2009-08-06
ITChaser 写道
倾向于lczheng的算法,算法复杂度最低,只需要一次循环。
改进:用数组而非Map存储。
附上本人这样的改进,大家拍拍砖。
/** * 统计字符串中出现最多的字母及其次数 * @author gogole_09 * */ public class CountChar { private int[] charCount = new int[26]; // 保存字母出现的次数,初步只统计26个字母(都转换成小写字母), /** * 统计字母出现次数 * * @param str */ private void countChar(String str) { str = str.toLowerCase(); // 字母a-z的索引 for (char chari = 'a'; chari <= (char) ('a' + 25); chari++) { for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); if (chari == ch) { charCount[chari - 'a']++; } } } } /** * 计算出现最多的字母 * @return */ private char getMaxChar() { char max = '?'; int maxcount = 0; for (char chari = 'a'; chari <= (char) ('a' + 25); chari++) { if (charCount[chari - 'a'] >= maxcount) { maxcount = charCount[chari - 'a']; max = chari; } } return max; } /** * 获取出现最多的字母出现的具体次数 * @return */ private int getMaxCount(){ return getMaxChar()=='?'?charCount[getMaxChar()-'a']:-1; } public static void main(String[] args) { String str="aaaaaabab"; CountChar c=new CountChar(); c.countChar(str); System.out.println(str+":中出现次数最多的字母是:"); System.out.println(c.getMaxChar()); System.out.println("出现次数是:"); System.out.println(c.getMaxCount()); } } |
|
返回顶楼 | |
发表时间:2009-08-06
这个。。。
一个LinkedHashMap不就完了吗? 把所有字符都放入这个map,值就是出现的次数 最后遍历这个map,取得值最大的就行了。而且如果多次出现的话,还可以按出现次序取得。 |
|
返回顶楼 | |
发表时间:2009-08-07
最后修改:2009-08-07
我也来玩一下 没有考虑多个字母出现次数相同的情况 欢迎拍砖
public static void main(String[] args) { String str = "hello wolrd wlllkdsfhksadfls?sdfls sdf.pqyutgvAAAxzsdfs lsdfj,ljsfd ajfdsak sfksjdfisfsdkfj lsdfjsidf jsafdalsjfs sfskdfjs"; String maxLetter = ""; int maxCount = 0; int countSave = 0; for (int i = 0; i < str.length(); i++) { String s = str.substring(i,i+1); countSave = 1; if(Character.isLetter(s.toCharArray()[0])){ for (int j = (i+1); j < str.length(); j++) { String s1 = str.substring(j,j+1); if(Character.isLetter(s1.toCharArray()[0])){ if(s.equals(s1)){ countSave++; } } } } if(maxCount < countSave){ maxLetter = s; maxCount = countSave; } } System.out.println(maxLetter+" "+maxCount); } |
|
返回顶楼 | |
发表时间:2009-08-10
最后修改:2009-08-15
没考虑多个字母出现次数相同的情况
String str = "sdgfkhssssssdkf sdhfkj sdk oii78sd f0 ds l !"; char[] al = str.toCharArray(); HashMap<Character,Integer> h = new HashMap<Character,Integer>(); Character maxChar = null; Integer max = 0; for(int i= 0; i < al.length; i++){ if(h.containsKey(al[i])){ Integer value = h.get(al[i]); h.put(al[i], value + 1); if(value + 1 > max){ max = value + 1; maxChar = al[i]; } }else{ h.put(al[i], 1); } } |
|
返回顶楼 | |
发表时间:2009-08-13
import java.io.BufferedReader; import java.io.FileReader; import java.io.InputStreamReader; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; /** * 统计一个文件中出现次数最多的字符和次数 * 功能: * 可统计最大次数相等的所有字符; * 提供了三种方式进行统计,分别是:从文件中读取;事先给定的字符串;从键盘中输入 * @author zhq * */ public class CharFrequent { /** * 读取一个文件的内容,按行读取 * * @param filename * 文件名称 * @return 返回文件的内容 * @throws Exception */ public static String read(String filename) throws Exception { BufferedReader in = new BufferedReader(new FileReader(filename)); String s; StringBuilder sb = new StringBuilder(); while ((s = in.readLine()) != null) sb.append(s + "\n"); in.close(); return sb.toString(); } /** * 核心算法 * * @param str * 要统计的字符串 * @return 所有最大的字符和该字符出现的次数(包括两个字符出现相等次数的情况) */ public static Map<Character, Integer> charFreq(String str) { // 把不是英文字符的全部去掉 str = str.replaceAll("[^a-zA-Z]", ""); Map<Character, Integer> map = new HashMap<Character, Integer>(); for (int i = 0; i < str.length(); i++) { char temp = str.charAt(i); Integer frequent = map.get(temp); map.put(temp, frequent == null ? 1 : frequent + 1); } int maxCount = Collections.max(map.values()); Set<Character> maxList = new HashSet<Character>(); for (Entry<Character, Integer> entry : map.entrySet()) { if (entry.getValue().equals(maxCount)) { maxList.add(entry.getKey()); } } map.clear();// 清空 for (char c : maxList) map.put(c, maxCount); return map; } public static void main(String[] args) { try { // 从文件中统计 System.out.println(charFreq(read(".\\src\\CharFrequent.java"))); // 从事先给定的字符串中统计 System.out.println(charFreq("wo xi&hjuj@an你是谁呀!a~vawjox#ih ua$n&javaj*j")); // 从键盘随机输入中统计 String in = (new BufferedReader(new InputStreamReader(System.in))).readLine(); System.out.println(charFreq(in)); } catch (Exception e) { new RuntimeException(e); } } } 输出结果: {e=103} {a=6, j=6} wfjlskajfwprweiorj87f786a^*&43248疯狂拉升房价阿斯兰房间打扫34u2347防洪法(此处是随便输入的) {w=3, f=3, j=3} |
|
返回顶楼 | |
发表时间:2009-08-13
最后修改:2009-08-13
纯路过 …… (ruby 1.9)
s = "sdfsddddddddddfffff,sdfsdf," h = Hash.new {|h,k| h[k] = 0 } s.each_char {|c| h[c] += 1 if c =~ /[a-zA-Z]/ } puts "'%s' max= %d" % \ h.inject(['',0]){|memo, kv| memo[1]>kv[1] ? memo : kv } 如果出现最多的字母不止一个: s = "神秘的 ccc 出现了 sss 次" h = Hash.new {|h,k| h[k] = 0 } s.each_char {|c| h[c] += 1 if c =~ /[a-zA-Z]/ } chs, max = [], 0 h.each {|ch, c| if max < c chs, max = [ch], c elsif max == c chs << ch end } puts "#{chs.join ','} max= #{max}" |
|
返回顶楼 | |