JavaScriptで最頻出の文字を抽出する方法。例によってmosyaの復習です。
問題
与えられた文字列に対して、最も頻繁に出現する文字とその回数を返す
関数 findMostFrequentChar を実装してください。
返り値は、以下のようなオブジェクトとして返してください。
{ char: 'a', count: 2 }
入力例:
findMostFrequentChar("abca");
出力例:
{ char: 'a', count: 2 }
ただし、もし出現回数が同じ文字が複数ある場合は、最初に出現した文字を返してください。
前提知識
for...of ループ
for (let 変数 of イテラブルオブジェクト) {
// 繰り返し処理
}
イテラブルオブジェクト(配列、文字列など)から1つずつ取り出して変数に代入し、ループ処理を回すことができる。インデックス(i=1...)を使わないでより直感的に理解しやすいため、今回はこれを使う。
オブジェクトと配列の違い
- オブジェクト
キーと値がセットで格納されている。
キーは 1.ドット記法 2.ブラケット記法 の2パターンで設定できる。
変数をキーとして使いたいときは、ブラケット記法を使う必要がある。
値に配列をいれることも可能
let obj = {name: "hanako", age: 25};
console.log(obj.name); // hanako
// キーに変数を設定する
const array = {};
let key = "キーです";
array[key] = "値です";
console.log(array); // {キーです: '値です'}
- 配列
要素を順番付けして格納する。
const array = ["banana", "apple", "mikan"];
console.log(array[1]); // apple
考え方
- 与えられた文字は一文字ずつに分解してループを回す
- 文字とその数を保存しておくオブジェクトが必要
- ループの中で最頻出の文字と番号を毎回更新する必要がある
解答例
function findMostFrequentChar(str) {
const obj = {}; // 文字をインデックスに個数をカウント
let maxCharacter = ''; // 最頻出の文字を格納する用
var maxNumber = 0; // 最大値をカウントして格納する用
for (let maxChar of str){
if(!obj[maxChar]){
obj[maxChar] = 0;
}
obj[maxChar] += 1;
if(maxNumber < obj[maxChar]){
maxCharacter = maxChar;
maxNumber = obj[maxChar];
}
}
return { char:maxCharacter, count:maxNumber };
}
console.log(findMostFrequentChar("abca")); // { char: 'a', count: 2 }
所感
最初は一文もコードが思いつかず、半泣きになった問題。
けれどもChatGPT先生にしつこく質問して、自力で解けたのでめちゃくちゃうれしかったです。