【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
-
JavaScript DOMとは?基本の仕組みと要素の取得方法をわかりやすく解説
JavaScriptのDOM(Document Object Model:ドキュメントオブジェクトモデル)は、Webページ上のHTML要素を表現する仕組みです。DOMはインターフェースとして機能し、ページのコンテンツやスタイルを変更することで、Webページを自由に操作できるようにします。 DOMにアクセスするには、Webページ上で右クリックして「検証(Inspect)」を選択します。すると画面の右側または左側にパネルが表示され、現在閲覧しているページのHTML要素を確認できます。要素にマウスカーソルを合わせると、ページ上の該当部分がハイライトされるため、どの要素がページのどのセクションに対応
-
JavaScriptでキューに要素を追加する(エンキュー)方法
キューへの要素追加(エンキュー)とは キューに要素を追加すること(エンキュー)とは、コンテナ配列の末尾に新しい要素を加える操作です。本記事では、配列の末尾をキューの「尾部(tail)」として扱い、すべての挿入操作をこの末尾に対して行います。つまり、先入れ先出し(FIFO)の構造において、新しく入ってくる要素は常に列の最後尾へ並ぶことになります。 この考え方に基づけば、enqueue 関数は次のようにシンプルに実装できます。 実装例:enqueue関数 enqueue(element) { // キューが満杯かどうかをチェック if (this.isFull()) {