Skip to main content

回傳出現最多次

題目:

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

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