数据结构与算法分析 -- 关于求出现最多次数的字母与次数

 统计字符串中出现最多的字母及其次数

 

 鉴于javaeye的强大资源,本人在泡论坛之余,学习到两种方法,特拿上来予以分享。

 由于有参考javaeye资料,具体链接已忘记了 - -! 如有侵权,请告知。

 

 现有两种方式求解:

 方法一:  利用数据结构map来求解。

 

public static void main(String[] args) {
		Map<String, Long> charTimes = new HashMap<String, Long>();
		String str = "aaaaabb";
		//遍历字符数组
		for (char each : str.toCharArray()) {
			
			if ((each >= 65 && each <= 90) || (each >= 97 && each <= 122)) {//是否为数字
				String charStr = String.valueOf(each);
				if (charTimes.containsKey(charStr)) {
					Long num = charTimes.get(charStr).longValue() + 1;
					charTimes.put(charStr, num);
				} else {
					charTimes.put(charStr, 1L);
				}
			}
		}

		String maxAppearChar = null;
		Long maxAppearTimes = 0L;
		//遍历map
		for (Map.Entry<String, Long> charAppear : charTimes.entrySet()) {
			if (charAppear.getValue() > maxAppearTimes) {
				maxAppearChar = charAppear.getKey();
				maxAppearTimes = charAppear.getValue();
			}
		}
		System.out.println("出现最多的字母:" + maxAppearChar);
		System.out.println("出现次数:" + maxAppearTimes);

	}

 

 方法2: 采用数组来求解, 其时间复杂度相对于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="aaabab";
		CountChar c=new CountChar();
		c.countChar(str);
		System.out.println(str+":中出现次数最多的字母是:");
		System.out.println(c.getMaxChar());
		System.out.println("出现次数是:");
		System.out.println(c.getMaxCount());
	}
}

 

 当然,此问题还有未考虑周全之处, 如发现有相同的最大值,该如何处理 【aabb】时。望大家集思广义,来拍拍砖.

 

你可能感兴趣的:(数据结构,C++,c,算法,C#)