回傳出現最多次

題目:

寫一個方法(函數):題目給一個字串,請回傳該字串出現最多次的字元。#

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