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] を返します。
解決策:距離に基づくソートの活用
この問題は、各要素と target の絶対的な距離(差の絶対値)を計算し、その距離が小さい順にソートすることで解決できます。具体的な手順は以下の通りです。
- 各要素について
Math.abs(a - target)を使ってtargetとの距離を計算する。 - 距離が小さい順に配列をソートする(距離が同じ場合は、値自体を比較して小さい方を先にする)。
- ソート後の配列から最初の2つの要素を取り出す。
- 最終的な出力として、取り出した2つの要素を昇順に並べ替えて返す。
実装コード例
以下が実際のコードです。
const arr = [1, 2, 3, 4, 5];
const target = 3;
const findClosest = (arr = [], target = 1) => {
const size = 2;
return arr.sort((a, b) => {
const distanceA = Math.abs(a - target);
const distanceB = Math.abs(b - target);
if (distanceA === distanceB) {
return a - b;
}
return distanceA - distanceB;
}).slice(0, size)
.sort((a, b) => a - b);
};
console.log(findClosest(arr, target));
実行結果
[2, 3]
コードの解説
このコードのポイントを詳しく見ていきましょう。
- 距離の計算: コールバック関数内で
Math.abs(a - target)とMath.abs(b - target)を使い、それぞれの要素がtargetからどれだけ離れているかを求めています。 - 同距離の場合の処理: 2つの要素が
targetから等しい距離にある場合(例えば target=3 に対して 2 と 4)、return a - bによってより小さい値を優先的に選ぶようにしています。 - 要素の抽出:
.slice(0, size)により、距離の近い順に並べ替えた配列の先頭2つを取得します。 - 最終的な並べ替え: 最後に
.sort((a, b) => a - b)を実行することで、出力結果を必ず昇順にしています。
注意点
なお、このコードでは Array.prototype.sort() が元の配列を破壊的に変更する点に注意が必要です。元の配列を保持したい場合は、arr.slice() やスプレッド構文 [...arr] でコピーを作成してからソートすると安全です。
-
JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法
問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に
-
JavaScriptで配列内の唯一の異なる文字列を見つける方法
問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と