[英]Javascript get all the most frequent characters in a string
我需要幫助,我如何能得到的不只是一個,但在一個字符串等最常見的字符/字母。
我的代碼僅適用於獲取常見字符之一。
但是當多個字符同樣常見時,只返回一個。 如果兩個字符很常見,我希望它返回兩個字符。
const x = mostCommonCharacter("abbbcddefffg");
console.log(x); // result is *b*
如果b和f是最常見的,我想返回bf
function mostCommonCharacter(str) {
const charHolder = {}; // { a: 1, b: 3, c: 1, d: 2, e: 1, f: 3, g: 1 }
str
.toLowerCase()
.split("")
.forEach(char => {
if (char != " ") {
if (charHolder[char] == null) {
charHolder[char] = 1;
} else {
charHolder[char] += 1;
}
}
});
let highest_num = 0;
let letter = "";
for (const key in charHolder) {
if (charHolder[key] > highest_num) {
highest_num = charHolder[key];
letter = key;
}
}
return letter;
}
但它只返回一個最常見的字符“ b ”
我需要的是它返回“ b ”和“ f ”,因為它們都是最常見的。 而不僅僅是b有沒有辦法做到這一點?
獲取highest_num
,然后再次遍歷對象並獲取count等於highest_num
那些字母
function mostCommonCharacter(str) { const charHolder = {}; // { a: 1, b: 3, c: 1, d: 2, e: 1, f: 3, g: 1 } str .toLowerCase() .split("") .forEach(char => { if (char != " ") { if (charHolder[char] == null) { charHolder[char] = 1; } else { charHolder[char] += 1; } } }); let highest_num = 0; for (const key in charHolder) { if (charHolder[key] > highest_num) { highest_num = charHolder[key]; } } let res = ''; for(let k in charHolder){ if(charHolder[k] === highest_num){ res += k; } } return res; } console.log(mostCommonCharacter("abbbcddefffg"))
可以通過使用reduce()
和Math.max
獲得更短的代碼版本
function mostCommonCharacter(str) { const charHolder = str .toLowerCase() .split('') .reduce((ac,a) => (ac[a] = ac[a] + 1 || 1, ac), {}); let max = Math.max(...Object.values(charHolder)); return Object.entries(charHolder).reduce((ac,[k,v]) =>v === max ? ac + k : ac, ''); } console.log(mostCommonCharacter("abbbcddefffg"))
您可以通過簡單的更改來完成此操作。 如果它等於“highest_num”,只需將字母添加到“letters”。
let highest_num = 0;
let letters = "";
for (const key in charHolder) {
if (charHolder[key] > highest_num) {
highest_num = charHolder[key];
letters = key;
} else if (charHolder[key] === highest_num) {
letters += key;
}
}
請找到一種更緊湊的方法,您可以使用Array.prototype.reduce
在將字符串拆分為數組后從字符串中獲取對象中的 {letter: frequency} 映射。
然后使用Object.entries
對 [key, values] 的條目進行排序后得到最頻繁和第二頻繁的字母:
const x = mostCommonCharacter("abbbcddefffg"); function mostCommonCharacter(str){ const dict = str.split("").reduce((acc, ele) =>{ acc[ele] = (acc[ele] || 0) + 1; return acc; }, {}); const letters = Object.entries(dict).sort((a, b) => b[1] - a[1]).map(a => a[0]); return letters.length > 1 ? letters.slice(0, 2).join("") : letters.length > 0 ? letters[0] : null; } console.log(x);
一種涉及使用hashmaps
的算法方法的解決方案。
var a = 'abbbcddefffg'; const counter = (str) => { var ch = {}; for(var i=0; i<str.length;i++) { if(str[i] in ch) { ch[str[i]] += 1 } else { ch[str[i]] = 1 } } return ch; } let sorted = (list) => Object.fromEntries(Object.entries(list).sort( (a,b) => b[1] - a[1] )) let counterInSorted = sorted(counter(a)); let getXMostOccuring = (stringObj, x) => { return Object.keys(stringObj).slice(0,x).join(''); } console.log('First x elements occuring frequently'); console.log(getXMostOccuring(counterInSorted,2)); console.log(sorted(counter(a)))
這種方法將以排序的方式提供每個字符的頻率。 您現在可以決定獲取 'x' 個最常出現的字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.