題目描述:找出一個字符串中出現(xiàn)次數(shù)最多的字符,如果有多個出現(xiàn)次數(shù)相同的字符抢肛,那就找出最先出現(xiàn)的那個字符
思考:
我的第一反應(yīng)是分三步:
- 遍歷字符串狼钮,統(tǒng)計每個字符出現(xiàn)的次數(shù)
- 找出最大的次數(shù)
- 找出最大次數(shù)對應(yīng)的那個字符
這樣解決是沒有問題的,但是太笨了捡絮,遍歷了三次燃领。經(jīng)過思考,發(fā)現(xiàn)可以利用map的特性锦援,只需要遍歷一次就可以解決問題猛蔽,貼上代碼如下:
/**
* 找出一個字符串中出現(xiàn)次數(shù)最多的字符,如果有多個出現(xiàn)次數(shù)相同的字符灵寺,就找出最先出現(xiàn)的那個曼库。
*/
public class FirstChar {
/**
* 使用倒序查找的方式找到首先出現(xiàn)的次數(shù)最多的那個字符
* @param str
* @return
*/
private static char searchFirstChar(String str) {
// 定義一個map,根據(jù)鍵值的唯一性略板,使用字符串中的字符作為鍵毁枯,出現(xiàn)的次數(shù)作為值
Map<Character, Integer> map = new HashMap<>();
// 將字符串轉(zhuǎn)化為字符數(shù)組
char[] ch = str.toCharArray();
// 定義一個最大次數(shù),初始值為0
int max = 0;
// 定義出現(xiàn)次數(shù)最多的字符叮称,初始值為第一個字符
char ret = ch[0];
// 倒敘遍歷字符串?dāng)?shù)組
for (int i = ch.length - 1; i >= 0; i--) {
// 如果map中存在該字符种玛,則將map中的value加1藐鹤,也就是字符出現(xiàn)的次數(shù)加1,
// 否則就設(shè)置當(dāng)前字符出現(xiàn)的次數(shù)為1
if (map.containsKey(ch[i])) {
// 將該字符出現(xiàn)的次數(shù)加1
map.put(ch[i], map.get(ch[i]) + 1);
// 如果該字符出現(xiàn)的次數(shù)大于max赂韵,則將max設(shè)置為當(dāng)前字符出現(xiàn)的次數(shù)娱节,
// 并將出現(xiàn)次數(shù)最多的字符置為當(dāng)前字符
if (map.get(ch[i]) >= max) {
max = map.get(ch[i]);
ret = ch[i];
}
} else {
map.put(ch[i], 1);
}
}
return ret;
}
public static void main(String[] args) {
// 測試字符
String str = "a1a2a3bbbcccdddeeefffddda23112211";
char c = FirstChar.searchFirstChar(str);
System.out.println(c);
}
}
執(zhí)行結(jié)果: