回傳出現最多次
題目:
寫一個方法(函數):題目給一個字串,請回傳該字串出現最多次的字元。
Example:
ex1:
input: "abcccccde"
output: "c"
ex2:
input: "qwer33444kif66666"
output: "6"
JS 解法
提示:
先把每個字元(character)出現的次數轉為 js 的 Object(key & value),
{"字元":出現次數}
像是下圖
ex: "hi there"
obj = {
"h": 2,
"i": 1,
" ": 1,
"t": 1,
"e": 2,
"r": 1
}
然後再找出出現次數最多的。
來看看實作吧!
function maxChar(str) {
// key and value
let charMap = {}
for(let char of str){
if(!charMap[char]){
charMap[char] = 1
} else {
charMap[char] = charMap[char] + 1
}
}
// find the max value in the js Object
let maxCount = 0
let maxstr = ""
for(let k in charMap){
if(charMap[k] > maxCount){
maxCount = charMap[k];
maxstr = k
}
}
return maxstr;
}
如果聰明的各位有想到,其實可以不用兩層迴圈,如下
function maxChar2(str) {
let max = 0
let maxChar = ''
let charMap = {}
for (let c of str) {
charMap[c] = charMap[c] ? charMap[c] + 1 : 1
if (charMap[c] > max) {
max = charMap[c]
maxChar = c
}
}
return maxChar
}
若要考慮到時間複雜度,第二種解法是比較快的唷!
也不是說第一種解法不好,第一種解法是把概念分開寫,會清楚一些。
看看各位讀者喜歡哪種囉!
Java 解法
與提示一樣的概念,只是 key & value 的資料型態在 Java 稱為 Map
public class MaxString {
private String maxStr(String str) {
String ary[] = str.split("");
//put string into key and value
Map<String, Integer> count = new HashMap<String, Integer>();
for (String achar : ary) {
count.put(achar, count.getOrDefault(achar, 0) + 1);
}
System.out.println("String hashmap:" + count);
String maxKey = "";
int maxValue = 0;
for (Map.Entry<String, Integer> entry : count.entrySet()) {
if (entry.getValue() > maxValue) {
maxValue = entry.getValue();
maxKey = entry.getKey();
}
}
System.out.println("Max String is" + maxKey);
return maxKey;
}
此文系列同時發佈於鐵人賽2020。