JavaScriptで文字列内の2番目に頻出する文字を見つける方法
はじめに
本記事では、文字列を引数として受け取り、その文字列の中で2番目に多く出現する文字を返すJavaScript関数を作成します。
この問題は、以下の手順で解決できます。
- 各文字の出現回数をオブジェクト(マップ)に記録する
- 出現回数を配列に変換し、降順にソートする
- ソート後の2番目の要素を取得して返す
実装例
実際のコードは次のとおりです。
const str = 'Hello world, I have never seen such a beautiful weather in the world';
const secondFrequent = str => {
const map = {};
for(let i = 0; i < str.length; i++){
map[str[i]] = (map[str[i]] || 0) + 1;
};
const freqArr = Object.keys(map).map(el => [el, map[el]]);
freqArr.sort((a, b) => b[1] - a[1]);
return freqArr[1][0];
};
console.log(secondFrequent(str));出力結果
コンソールには以下のように出力されます。
e
コードの解説
処理の流れを順番に見ていきましょう。
1. 出現回数のカウント
まず、空のオブジェクト map を用意し、文字列を先頭から1文字ずつ走査します。(map[str[i]] || 0) + 1 という記述により、その文字がまだ登場していなければ1を設定し、すでに存在すればカウントを1ずつ増やしていきます。
2. 配列への変換とソート
Object.keys(map) で全ての文字(キー)を取得し、[文字, 出現回数] の形式の配列に変換します。その後、sort() を使って出現回数の降順に並べ替えます。
3. 2番目の要素を返す
降順ソート済みの配列のインデックス 1(2番目の要素)から文字を取り出して返せば完成です。サンプルの文字列では「e」が最も多く、「o」や「l」などがそれに続くため、結果として「e」が…ではなく最頻文字との関係で2番目に出現回数の多い文字が返されます。
まとめ
このように、ハッシュマップによる集計とソートを組み合わせることで、文字列内の2番目に頻出する文字を簡単に求めることができます。計算量は O(n log n)(ソート部分が支配的)となり、実用上十分なパフォーマンスです。
-
JavaScriptでアルファベットの1始まりのインデックスを取得する方法
問題JavaScriptで関数を作成する必要があります。この関数は、小文字の英字アルファベット1文字を受け取り、その文字がアルファベットの中で何番目に位置するかを「1始まり」のインデックスとして返します。例えば、a なら 1、j なら 10 を返すといったイメージです。無効な入力が渡された場合は -1 を返してエラーを通知すると親切です。実装の考え方最もシンプルな方法は、先頭に半角スペースを付けたアルファベット文字列「 abcdefghijklmnopqrstuvwxyz」を基準(レジェンド)として用意することです。こうすることで、スペースが0番目となり、a は1番目、j は10番目というよう
-
【JavaScript】配列内で最も頻出する単語を上位N件抽出する方法
問題概要英小文字のみで構成された文字列の配列 arr を第一引数として受け取り、数値 num(num は配列の長さより小さい値)を第二引数として受け取る JavaScript 関数を作成します。この関数は、配列 arr 内で最も頻出する要素を上位 num 件返す必要があります。結果は出現回数が多い順に並べます。また、出現回数が同じ単語が複数ある場合は、辞書順(アルファベット順)で先に来る単語を優先して並べます。入力例const arr = [the, day, is, sunny, the, the, the, sunny, is, is]; const num = 4;出力例const ou