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

【JavaScript】3つの数値の真ん中(中間値)を最小限の比較で求める方法

この記事では、ソートされていない3つの数値を受け取り、比較回数を最小限に抑えてその中間の値(真ん中の数)を返すJavaScript関数の実装方法を解説します。

問題の概要

例えば、次のような3つの数値が与えられたとします。

34, 45, 12

この場合、関数は以下の値を返す必要があります。

34

サンプルコード

以下が実際の実装コードです。

const num1 = 34;
const num2 = 45;
const num3 = 12;

const middleOfThree = (a, b, c) => {
   // x は a が b より大きければ正、小さければ負になる
   const x = a - b;
   const y = b - c;
   const z = a - c;

   // x と y の符号が同じなら、b が中間値
   if (x * y > 0) {
      return b;
   } else if (x * z > 0) {
      return c;
   } else {
      return a;
   }
};

console.log(middleOfThree(num1, num2, num3));

コードの仕組み

このアルゴリズムのポイントは、差の積の符号を利用して大小関係を判定するところにあります。具体的な流れは以下の通りです。

  • x = a − b:a が b より大きければ正、小さければ負の値になります。
  • y = b − c:b が c より大きければ正、小さければ負の値になります。
  • x × y > 0 の場合:x と y の符号が一致している、つまり「a > b > c」または「a < b < c」の順序になっているため、b が中間値です。
  • x × z > 0 の場合:a と c の大小関係から判断して、c が中間値であることが分かります。
  • いずれの条件にも当てはまらない場合は、a が中間値となります。

なお、元のコードでは変数宣言が省略されていますが、意図しないグローバル変数の生成を避けるため、上記のように const で宣言しておくのが安全です。

この手法なら最大でも2回の条件判定だけで中間値を特定でき、if文を組み合わせた単純な比較よりも効率的に処理できます。

出力結果

コンソールには以下のように出力されます。

34
  1. JavaScript DOMとは?基本の仕組みと要素の取得方法をわかりやすく解説

    JavaScriptのDOM(Document Object Model:ドキュメントオブジェクトモデル)は、Webページ上のHTML要素を表現する仕組みです。DOMはインターフェースとして機能し、ページのコンテンツやスタイルを変更することで、Webページを自由に操作できるようにします。 DOMにアクセスするには、Webページ上で右クリックして「検証(Inspect)」を選択します。すると画面の右側または左側にパネルが表示され、現在閲覧しているページのHTML要素を確認できます。要素にマウスカーソルを合わせると、ページ上の該当部分がハイライトされるため、どの要素がページのどのセクションに対応

  2. JavaScriptでキューに要素を追加する(エンキュー)方法

    キューへの要素追加(エンキュー)とは キューに要素を追加すること(エンキュー)とは、コンテナ配列の末尾に新しい要素を加える操作です。本記事では、配列の末尾をキューの「尾部(tail)」として扱い、すべての挿入操作をこの末尾に対して行います。つまり、先入れ先出し(FIFO)の構造において、新しく入ってくる要素は常に列の最後尾へ並ぶことになります。 この考え方に基づけば、enqueue 関数は次のようにシンプルに実装できます。 実装例:enqueue関数 enqueue(element) { // キューが満杯かどうかをチェック if (this.isFull()) {