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

JavaScriptで配列内の唯一異なる数値を見つける方法

ほぼすべての要素が同じで、ただ1つだけ異なる値が混ざった配列を受け取り、その「例外的な値」を返すJavaScript関数を作成してみましょう。配列操作の基本となるアルゴリズム課題のひとつで、ループ処理と条件分岐の理解を深めるのに最適な題材です。

問題の概要

たとえば、次のような配列が与えられたとします。すべての要素が 4 である一方、先頭だけが 2 になっています。

[2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]

この場合、関数は例外的な値である 2 を返す必要があります。なお、ここでは配列の長さが最低3要素以上あることを前提とします(2要素では「多数派」を判定できないためです)。

実装コード

以下が実際のコードです。隣り合う要素同士を比較することで、例外的な値の位置を特定します。

const arr = [2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4];

// 配列の長さは最低3要素あることを前提とする
const findUnlike = arr => {
  for(let i = 1; i < arr.length - 1; i++){
    // 前の要素と異なり、次の要素と一致する → 前の要素が例外的
    if(arr[i] !== arr[i - 1] && arr[i] === arr[i + 1]){
      return arr[i - 1];
    }
    // 前後どちらの要素とも異なる → 現在の要素が例外的
    else if(arr[i] !== arr[i - 1] && arr[i] !== arr[i + 1]){
      return arr[i];
    }
    // 前の要素と一致し、次の要素と異なる → 次の要素が例外的
    else if(arr[i] === arr[i - 1] && arr[i] !== arr[i + 1]){
      return arr[i + 1];
    }
  }
};

console.log(findUnlike(arr));

ロジックの解説

この関数は、配列の2番目の要素から末尾の手前まで順に走査しながら、次の3パターンを判定しています。

  • 前の要素と異なり、次の要素と一致する場合:例外的なのは前の要素
  • 前後どちらの要素とも異なる場合:例外的なのは現在の要素
  • 前の要素と一致し、次の要素と異なる場合:例外的なのは次の要素

いずれかの条件に合致した時点で値を即座に返却するため、不要な計算が発生しません。

よりシンプルな代替アプローチ

ES6以降の配列メソッドを使えば、さらに簡潔に書くこともできます。先頭3要素から「多数派の値」を特定し、find() でそれと異なる最初の要素を取得します。

const findUnlike = arr => {
  // 先頭3要素から多数派の値を特定する
  const common = (arr[0] === arr[1] || arr[0] === arr[2]) ? arr[0] : arr[1];
  // 多数派と異なる最初の要素を返す
  return arr.find(num => num !== common);
};

console.log(findUnlike([2, 4, 4, 4, 4])); // 2

こちらの方法は、例外的な値が配列のどの位置にあっても(先頭・中間・末尾)確実に検出できるのが特徴です。

出力結果

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

2
  1. JavaScriptで配列内の3番目に大きい数値を取得する方法

    JavaScriptでは、数値の配列を第1引数(唯一の引数)として受け取る関数を作成することが求められます。この関数の役割は、配列の中から3番目に大きい数値を選び出して返すことです。もし配列内に3番目に大きい数値が存在しない場合(ユニークな数値が3つ未満の場合)は、代わりに配列の最大値を返します。具体例たとえば、入力配列が以下のようになっているとします。const arr = [34, 67, 31, 87, 12, 30, 22];この場合、数値を降順に並べると「87 → 67 → 34」となるため、期待される出力は次のとおりです。const output = 34;実装コードこの処理を実現

  2. 【JavaScript入門】配列内で最初の非連続な数値を見つける方法

    はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実