JavaScriptで配列内の3番目に大きい数値を取得する方法
JavaScriptでは、数値の配列を第1引数(唯一の引数)として受け取る関数を作成することが求められます。この関数の役割は、配列の中から3番目に大きい数値を選び出して返すことです。もし配列内に3番目に大きい数値が存在しない場合(ユニークな数値が3つ未満の場合)は、代わりに配列の最大値を返します。
具体例
たとえば、入力配列が以下のようになっているとします。
const arr = [34, 67, 31, 87, 12, 30, 22];
この場合、数値を降順に並べると「87 → 67 → 34」となるため、期待される出力は次のとおりです。
const output = 34;
実装コード
この処理を実現するコードは以下のとおりです。
const arr = [34, 67, 31, 87, 12, 30, 22];
const findThirdMax = (arr = []) => {
// 重複した値を除外して配列を詰める
const map = {};
let j = 0;
for (let i = 0, l = arr.length; i < l; i++) {
if (!map[arr[i]]) {
map[arr[i]] = true;
} else {
continue;
}
arr[j++] = arr[i];
}
arr.length = j;
// ユニークな要素が3つ未満なら最大値を返す
let result = -Infinity;
if (j < 3) {
for (let i = 0; i < j; ++i) {
result = Math.max(result, arr[i]);
}
return result;
} else {
// 昇順にソートして後ろから3番目の要素を取得
arr.sort(function (prev, next) {
if (next >= prev) return -1;
return 1;
});
return arr[j - 3];
}
};
console.log(findThirdMax(arr));コードのポイント
1. 重複値の除外
オブジェクトmapをフラグとして使い、すでに処理済みの値をスキップすることで、配列内の重複を取り除いています。これにより、「3番目に大きい数」が正しくユニークな値の基準で判定されます。
2. 要素数が3未満の場合のフォールバック
重複を除いた後の要素数jが3未満の場合は、3番目に大きい数が存在しないため、ループで最大値を求めて返します。初期値に-Infinityを使用することで、負の数が含まれる配列にも対応できます。
3. ソートによる3番目の値の取得
要素が3つ以上ある場合は、比較関数を使って昇順にソートし、末尾から3番目の要素arr[j - 3]を返すことで、3番目に大きい数値を取得しています。
実行結果
コンソールには次のように出力されます。
34
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実
-
JavaScriptで昇順配列の中から並び順を壊している唯一の要素を見つける方法
この記事では、昇順(増加順)にソートされた数値の配列の中に、ただひとつだけ並び順を乱している要素がある場合に、その要素を特定して返すJavaScript関数の実装方法を解説します。 問題の定義 扱う配列は基本的に昇順でソートされていますが、その中の要素がひとつだけ順序から外れています。関数の目的は、その「異常な要素」を見つけ出して返すことです。 たとえば、次のような配列を考えます。 const arr = [1, 2, 3, 4, 17, 5, 6, 7, 8]; この配列から「17」を取り除けば残りは完全な昇順になるため、求める答えは「17」です。 解決のアプローチ 昇順の配列では、隣り合う