JavaScriptで配列に存在しない最小の正の整数を見つける方法
JavaScriptでは、整数の配列を第一引数(唯一の引数)として受け取る関数を作成する必要があります。
この関数の役割は、配列に存在しない最小の正の整数を見つけて返すことです。
問題の例
たとえば、入力配列が次のような場合を考えてみましょう。
const arr = [4, 2, -1, 0, 3, 9, 1, -5];
このとき、期待される出力は次のとおりです。
const output = 5;
理由は簡単です。1、2、3、4はすでに配列内に存在していますが、5は配列に含まれていないため、存在しない最小の正の整数となります。
なお、負の数(-1、-5)や0は正の整数ではないため、答えの候補からは除外されます。
基本的なアプローチ
最も直感的な方法は、1から順番に数え上げていき、配列に含まれていない最初の値を見つけることです。Array.prototype.indexOf()メソッドを使えば、各候補の値が配列内に存在するかどうかを簡単に確認できます。
コード例
const arr = [4, 2, -1, 0, 3, 9, 1, -5];
const findSmallestMissing = (arr = []) => {
let count = 1;
// 配列が空またはnull / undefinedの場合は 1 を返す
if (!arr?.length) {
return count;
};
// count が配列に存在する限り、カウントを進める
while (arr.indexOf(count) !== -1) {
count++;
};
return count;
};
console.log(findSmallestMissing(arr));出力結果
5
コードの解説
- 変数
countを1で初期化します(探索の開始点)。 - オプショナルチェイニング(
?.)により、配列が空・null・undefinedの場合でもエラーにならず、安全に1を返します。 whileループ内でindexOf()を使い、countが配列に存在するかを判定します。存在すればcountをインクリメントして次の候補へ進みます。- 配列に存在しない値に到達した時点でループを抜け、その値を結果として返します。
パフォーマンスを改善したSet版
上記の実装はシンプルで分かりやすい一方、indexOf() は呼び出しごとに線形時間 O(n) かかるため、最悪ケースの計算量は O(n²) になります。
データ量が多い場合は、Set を使うと効率的です。Set.has() は平均 O(1) で動作するため、全体の計算量を O(n) まで改善できます。
const findSmallestMissing = (arr = []) => {
const set = new Set(arr);
let count = 1;
while (set.has(count)) {
count++;
};
return count;
};
console.log(findSmallestMissing([4, 2, -1, 0, 3, 9, 1, -5])); // 5まとめ
- 「存在しない最小の正の整数」は、1から順に確認していけば必ず見つかる。
- 小規模なデータなら
indexOf()ベースの実装でも十分実用的。 - 大規模な配列を扱う場合は
Setを活用することで、計算量を O(n²) から O(n) へ大幅に改善できる。
-
JavaScriptで配列要素をそのインデックスでべき乗した値に変換する方法
問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、入力配列の各要素を、その要素の位置を示す0始まりのインデックスでべき乗し、新しい配列へと変換します。そして最終的に、この新しい配列を返します。 例えば、インデックス0にある要素は0乗(常に1)、インデックス3にある要素は3乗、というように各要素が処理されます。 実装のポイント ループで配列を走査しながら、各要素とそのインデックスを同時に取得する Math.pow() を使って「要素 ^ インデックス」を計算する 計算結果を結果配列の同じ位置に格納する なお、モダンなJavaScriptでは Math
-
【JavaScript】配列の中で左右の合計が等しくなる中央インデックス(ピボットインデックス)を見つける方法
問題数値の配列 arr が与えられたとき、「あるインデックスより左側にあるすべての要素の合計」と「そのインデックスより右側にあるすべての要素の合計」が等しくなる位置(中央インデックス/ピボットインデックス)を求める JavaScript 関数を作成します。該当するインデックスが複数存在する場合は、最初に見つかったものを返し、存在しない場合は -1 を返すのが一般的です。たとえば、次のような入力を考えます。入力const arr = [1, 7, 3, 6, 5, 6];出力const output = 3;出力の解説インデックス 3 の要素は nums[3] = 6 です。この要素の左側にある