JavaScriptで別の配列に含まれる要素の出現頻度を数える方法
問題
今回は、2つの文字列配列を受け取るJavaScript関数を作成します。この関数は、2番目の配列に含まれる各文字列が、1番目の配列の中に何回出現するかをカウントし、その結果を配列として返す必要があります。
例えば、1番目の配列に 'abc' が2回含まれていれば、結果には 2 が出力されるイメージです。
コード例
以下は、二重ループを使用して出現回数をカウントするシンプルな実装例です。
const arr1 = ['abc', 'abc', 'xyz', 'cde', 'uvw'];
const arr2 = ['abc', 'cde', 'uap'];
const findFrequency = (arr1 = [], arr2 = []) => {
const res = [];
let count = 0;
// 2番目の配列の各要素について処理
for (let i = 0; i < arr2.length; i++) {
// 1番目の配列全体を走査して一致する要素をカウント
for (let j = 0; j < arr1.length; j++) {
if (arr2[i] === arr1[j]) {
count++;
}
}
res.push(count);
count = 0; // カウンターをリセット
}
return res;
};
console.log(findFrequency(arr1, arr2));出力
[2, 1, 0]
結果の解説
'abc'は1番目の配列に2回出現するため 2'cde'は1番目の配列に1回だけ出現するため 1'uap'は1番目の配列に存在しないため 0
このように、結果の配列は入力した2番目の配列と同じ順序・同じ長さで対応します。
より簡潔な書き方:map と filter を活用
二重ループを明示的に書かなくても、map() と filter() を組み合わせることで、同じ処理をより宣言的かつ簡潔に記述できます。
const findFrequency = (arr1 = [], arr2 = []) => arr2.map(str => arr1.filter(item => item === str).length); console.log(findFrequency(['abc', 'abc', 'xyz', 'cde', 'uvw'], ['abc', 'cde', 'uap'])); // 出力: [2, 1, 0]
この書き方は可読性が高く、意図も伝わりやすいため、実務でもよく使われるパターンです。ただし、どちらの方法も計算量は O(n × m) となるため、非常に大きな配列を扱う場合は、事前に Map やオブジェクトで1番目の配列の頻度表を作成しておくとパフォーマンスを改善できます。
-
JavaScriptで配列を出現頻度の昇順に並べ替える方法
問題数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。配列 arr には重複した要素が含まれている可能性があります。この関数では、出現回数が少ない要素から順に配列を並べ替えます。つまり、出現頻度の低い要素を先頭に配置し、頻度の昇順に沿って残りの要素を並べていきます。なお、出現回数が同じ要素が複数存在する場合は、それらを値の昇順(小さい順)に配置する必要があります。入力例const arr = [5, 4, 5, 4, 2, 1, 12];出力例[1, 2, 12, 4, 4, 5, 5]出力の解説数値「1」「2」「12」はそれぞれ1回しか出現しない
-
C++で別の配列を使って配列の要素を最大化する方法
C++では、2つの配列を組み合わせて「大きい要素だけを持つ配列」を作り出すことができます。本記事では、サイズnの2つの配列が与えられたとき、両方の配列からn個の最大かつ重複しない要素を抜き出し、第2配列を優先しながら元の順序を保って第1配列を書き換えるアルゴリズムを、サンプルコードと実行結果あわせて解説します。 問題の概要 サイズnの2つの配列が与えられます。第2配列の要素を使って第1配列を最大化します。このとき、新しく作られる配列は次の条件を満たす必要があります。 両方の配列に含まれる要素の中から、大きい方からn個を選ぶ 選んだ要素は重複してはならない(すべて一意であること) 第2配列の要