JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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 の絶対的な距離(差の絶対値)を計算し、その距離が小さい順にソートすることで解決できます。具体的な手順は以下の通りです。

  1. 各要素について Math.abs(a - target) を使って target との距離を計算する。
  2. 距離が小さい順に配列をソートする(距離が同じ場合は、値自体を比較して小さい方を先にする)。
  3. ソート後の配列から最初の2つの要素を取り出す。
  4. 最終的な出力として、取り出した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] でコピーを作成してからソートすると安全です。

  1. JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法

    問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に

  2. JavaScriptで配列内の唯一の異なる文字列を見つける方法

    問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と