JavaScriptで配列内の数値とそのn倍の関係を検出する方法
問題の概要
整数の配列を第一引数として、数値 n を第二引数として受け取るJavaScript関数を作成する必要があります。
この関数は、配列内に「一方が他方のn倍」という関係を満たす2つの数値が存在するかどうかを判定します。そのようなペアが存在すれば true を返し、存在しなければ false を返します。
入力例
配列と数値が以下の場合:
const arr = [4, 2, 7, 8, 3, 9, 5]; const n = 4;
出力例
このときの出力は次のようになります。
const output = true;
その理由は、配列内に 2 と 8 という数値が存在し、以下の関係が成り立つからです。
8 = 2 * 4
実装コード
以下が実際のコードです。
const arr = [4, 2, 7, 8, 3, 9, 5];
const n = 4;
const containsNthMultiple = (arr = [], n = 1) => {
const hash = new Set();
for(let i = 0; i < arr.length; i++){
const el = arr[i];
const [left, right] = [el / n, el * n];
if(hash.has(left) || hash.has(right)){
return true;
};
hash.add(el);
};
return false;
};
console.log(containsNthMultiple(arr, n));出力結果
コンソールには次のように表示されます。
true
コードの解説
このアルゴリズムのポイントは、Set(ハッシュセット)を使ってこれまで走査した要素を記録している点です。各要素について、「その要素を n で割った値(left)」と「その要素に n を掛けた値(right)」のどちらかがすでに Set 内に存在するかを確認します。存在していれば、n倍の関係を満たすペアが見つかったことになり、即座に true を返します。
この手法により、全要素同士を比較する二重ループ(計算量 O(n²))を使わずに、線形時間 O(n) で効率的に判定できるのが大きなメリットです。大規模な配列を扱う場合でも高速に動作します。
-
JavaScriptで2進数配列に含まれる連続する「1」の最大長を求める方法
問題の概要JavaScriptで、0と1のみから構成されるバイナリ配列(2進数配列)を引数として受け取り、その中で「1」が連続している部分配列の最大の長さを返す関数を作成する必要があります。例えば、入力配列が以下の場合を考えてみましょう。const arr = [1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1];この場合、最も長く連続する「1」は4つあるため、出力は次のようになります。const output = 4;解決アプローチ:スライディングウィンドウ法この問題はスライディングウィンドウ(尺取り法)というアルゴリズムを使うことで効率的に解けます。これは、
-
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