论坛首页 Java企业应用论坛

面试题目

浏览 32989 次
锁定老帖子 主题:面试题目
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-04  
论坛里面好像有这个问题 并且有解答!!!
呼呼
0 请登录后投票
   发表时间:2009-08-05  
倾向于lczheng的算法,算法复杂度最低,只需要一次循环。

改进:用数组而非Map存储。
0 请登录后投票
   发表时间:2009-08-05  
ITChaser说到得改进是什么意思呢?能否贴上代码
0 请登录后投票
   发表时间:2009-08-05  
看了大家的实现,好像都没有处理有多个相同最大值的情况哦!
0 请登录后投票
   发表时间: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());
	}
}
 
0 请登录后投票
   发表时间:2009-08-06  
这个。。。
一个LinkedHashMap不就完了吗?
把所有字符都放入这个map,值就是出现的次数
最后遍历这个map,取得值最大的就行了。而且如果多次出现的话,还可以按出现次序取得。
0 请登录后投票
   发表时间: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);
	}
0 请登录后投票
   发表时间: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);
	}
}

0 请登录后投票
   发表时间: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}
0 请登录后投票
   发表时间: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}"
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics