JavaScriptで配列内の各要素の出現回数が一意かどうかを判定する方法
本記事では、整数の配列を第1引数(唯一の引数)として受け取り、配列内に存在するすべての整数の出現回数が一意(ユニーク)であるかどうかを判定するJavaScript関数を作成します。
問題の概要
この関数は、配列内の各要素が出現する回数が互いに異なる場合には true を返し、同じ出現回数を持つ要素がひとつでも存在する場合には false を返す必要があります。
入力例
const arr = [7, 5, 5, 8, 2, 4, 7];
出力例
const output = false;
この場合の出力が false になる理由は、整数 7 と 5 の両方が2回ずつ出現しており、出現回数が重複しているためです。
解決のアプローチ
まずハッシュマップ(オブジェクト)を使って、各整数とその出現回数(頻度)を対応付けます。次に、そのマップをもとに一意な頻度だけを格納するSetを構築し、すでにSetに存在する頻度が見つかった時点で false を返します。最後まで重複がなければ true を返します。
この手法により、時間計算量 O(n)・空間計算量 O(n) で効率的に判定できます。
実装コード
以下が実際のコードです。
const arr = [7, 5, 5, 8, 2, 4, 7];
const uniqueAppearances = (arr = []) => {
const map = {};
const set = new Set();
for(let i = 0; i < arr.length; i++){
const el = arr[i];
map[el] = (map[el] || 0) + 1;
};
for(key in map){
const value = map[key];
if(set.has(value)){
return false;
};
set.add(value);
};
return true;
};
console.log(uniqueAppearances(arr));実行結果
コンソールへの出力は以下のとおりです。
false
-
JavaScriptで複数の配列から要素を交互に取り出して1つの配列にまとめる方法
問題 今回は、任意の個数の配列を引数として受け取り、それらすべての配列から要素を交互に(順番に一つずつ)取り出して、新しい配列を組み立てるJavaScript関数を作成します。 例えば、関数への入力が次のような場合を考えてみましょう。 入力 const arr1 = [1, 2, 3, 4]; const arr2 = [11, 12, 13, 14]; const arr3 = [a, b, c]; 出力 const output = [1, 11, a, 2, 12, b, 3, 13, c, 4, 14]; ご覧のとおり、まず各配列の先頭要素(1、11、a)、次に各配列の2番目の要素(
-
JavaScriptで配列内の特定の数値に最も近い2つの要素を検索する方法
問題の概要JavaScriptで、ソート済みの整数配列 arr を第一引数に、目標となる数値 target を第二引数に受け取る関数を作成します。この関数は、配列内に存在する要素の中から target に最も近い2つの数値を選び、それらを昇順に並べた配列として返す必要があります。例えば、以下のような入力が与えられた場合を考えてみましょう。入力:const arr = [1, 2, 3, 4, 5];const target = 3;出力:const output = [2, 3];この場合、target の値が 3 であるため、最も近い2つの要素は 2 と 3 となり、昇順に並べて [2, 3