数据结构与算法分析 -
统计字符串中出现最多的字母及其次数鉴于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;//遍历mapfor (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个字母(都转换成小写字母),/** * 统计字母出现次数 ** @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++;}}}}/** * 计算出现最多的字母 * @return */private char getMaxChar() {char max = '?';int maxcount = 0;for (char chari = 'a'; chari <= (char) ('a' + 25); chari++) {if (charCount >= maxcount) {maxcount = charCount;max = chari;}}return max;}/** * 获取出现最多的字母出现的具体次数 * @return */private int getMaxCount(){return getMaxChar()=='?'?charCount:-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】时。望大家集思广义,来拍拍砖.
页:
[1]