JavaScriptで配列内の「値と出現頻度が一致する整数」を見つける方法
本記事では、整数の配列を引数に受け取り、「その値自身と出現回数が一致する整数」が存在するかどうかを判定する JavaScript 関数の実装方法を解説します。
例えば、ある整数 4 が配列内にちょうど 4 回出現している場合、この整数は条件を満たしています。少なくとも 1 つでも該当する整数が存在すればその値を返し、存在しない場合は -1 を返します。
問題の概要
以下のような配列を考えてみましょう。
const arr = [3, 4, 3, 8, 4, 9, 7, 4, 2, 4];
各要素の出現回数を数えると次のようになります。
- 2: 1 回
- 3: 2 回
- 4: 4 回 ← 値と出現回数が一致!
- 7: 1 回
- 8: 1 回
- 9: 1 回
この場合、「4」が 4 回出現しているため、期待される出力は次のとおりです。
const output = 4;
実装の考え方
この問題は、次の 2 つのステップで解くことができます。
- 出現回数を記録する: オブジェクト(ハッシュマップ)を使って、各整数が何回出現したかをカウントします。
- 一致するものを探す: カウント結果を走査し、「キー(値)=== 出現回数」となる要素があればその値を返します。
サンプルコード
const arr = [3, 4, 3, 8, 4, 9, 7, 4, 2, 4];
const checkValueFrequency = (arr = []) => {
// 各要素の出現回数を記録するマップを作成
const map = {};
for (let i = 0; i < arr.length; i++) {
const el = arr[i];
map[el] = (map[el] || 0) + 1;
}
// 値と出現回数が一致する要素を探す
for (key in map) {
if (+key === map[key]) {
return +key;
}
}
// 該当する要素がなければ -1 を返す
return -1;
};
console.log(checkValueFrequency(arr));コードのポイント解説
map[el] || 0の部分は、まだキーが存在しない場合は0を初期値として扱うテクニックです。これにより未定義(undefined)との加算エラーを防げます。- オブジェクトのキーは文字列として保存されるため、比較時に単項プラス演算子
+を使って数値へ変換しています。 - どの要素も条件を満たさない場合は、規約に従って
-1を返します。
実行結果
コンソールには以下のように出力されます。
4
計算量について
このアルゴリズムは配列を 2 回走査するだけなので、時間計算量は O(n)、追加で使用するのは出現回数を格納するオブジェクトのみのため、空間計算量も O(n) となります。大規模な配列でも効率的に動作する実装です。
-
JavaScriptのfind()関数とは?配列から条件に合う最初の要素を取得する方法
JavaScriptのfind()メソッドは、配列の中から指定した条件を満たす最初の要素の値を返すために使用されます。条件を満たす要素がひとつも存在しない場合は、undefinedが返されます。find()は配列全体を走査しますが、条件に一致する要素が見つかった時点で処理を終了するため、効率的に目的の要素を取得できるのが特徴です。find()の基本構文array.find(function(val, index, arr), thisValue)パラメータの説明function:各要素に対して実行されるテスト関数val:現在処理中の要素の値(必須)index:現在処理中の要素のインデックス番号
-
JavaScriptのArray.prototype.find()メソッドとは?使い方をサンプルコードで解説
Array.prototype.find() メソッドは、配列の中から指定した条件(テスト関数)を満たす最初の要素の値を返します。 条件に一致する要素が見つかった時点で検索を終了するため、大きな配列でも効率的に動作します。また、どの要素も条件を満たさなかった場合は undefined を返すという点も重要な特徴です。 find()メソッドの基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback:各要素に対して実行されるテスト関数。true を返した要素が結果となります。 thisArg(省略可):callb