JavaScriptでスペース区切りの数値文字列から最大値と最小値を抽出する方法
問題
今回実装するのは、スペースで区切られた複数の数値を含む文字列を引数として受け取るJavaScript関数です。関数は、文字列の中から最大の数値と最小の数値だけを抜き出し、それらをスペースで区切った1つの文字列として返す必要があります。
入力例:
const str = '5 57 23 23 7 2 78 6';
出力例:
const output = '78 2';
これは、配列内の最大値が 78、最小値が 2 であるためです。
解決策:reduce() を使った実装
以下のコードでは、split() で文字列を配列に変換し、reduce() メソッドを使って1回の走査で最大値と最小値を同時に求めています。
const str = '5 57 23 23 7 2 78 6';
const pickGreatestAndSmallest = (str = '') => {
const strArr = str.split(' ');
let creds = strArr.reduce((acc, val) => {
let { greatest, smallest } = acc;
greatest = Math.max(val, greatest);
smallest = Math.min(val, smallest);
return { greatest, smallest };
}, {
greatest: -Infinity,
smallest: Infinity
});
return `${creds.greatest} ${creds.smallest}`;
};
console.log(pickGreatestAndSmallest(str));
出力結果
78 2
コードの解説
str.split(' '):入力文字列をスペースで分割し、数値文字列の配列に変換します。reduce():配列を順番に処理し、初期値{ greatest: -Infinity, smallest: Infinity }を起点として各要素との比較を繰り返します。Math.max()とMath.min():現在の値と累積値を比較し、それぞれ最大値・最小値を更新していきます。- 初期値に
-Infinity(負の無限大)とInfinity(正の無限大)を使用することで、入力される数値の範囲に関わらず正しく動作します。 - 最後にテンプレートリテラルで「最大値 最小値」の形式の文字列を組み立てて返しています。
別のアプローチ:スプレッド構文を使う簡潔な書き方
よりシンプルに記述したい場合は、map(Number) で数値化した配列に対して、スプレッド構文(...)と Math.max()/Math.min() を直接組み合わせる方法もあります。
const pickGreatestAndSmallest = (str = '') => {
const nums = str.split(' ').map(Number);
return `${Math.max(...nums)} ${Math.min(...nums)}`;
};
console.log(pickGreatestAndSmallest('5 57 23 23 7 2 78 6')); // "78 2"
ただし、要素数が極端に多い配列では、スプレッド構文による引数展開でスタックオーバーフローが発生する可能性があります。大規模なデータを扱う場合は、前述の reduce() を使った実装の方が安全で効率的です。
-
JavaScriptで指定した範囲内にある「ある数で割り切れる数」の個数を求める方法
問題2つの整数からなる範囲(配列)を第1引数に、1つの数値を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在する「入力された数値で割り切れる数」をすべて見つけ、その合計個数を返します。サンプルコード以下がその実装例です。const range = [6, 57]; const num = 3; const findDivisibleCount = (num = 1, [l, h]) => { let count = 0; for(let i = l; i <= h; i++
-
JavaScriptで文字列内の最長連続文字とその出現回数を検索する方法
問題文字列を受け取り、その中で最も長く連続して現れる文字とその連続回数を返すJavaScript関数を作成する必要があります。戻り値は必ず2つの要素を持つ配列とします。1つ目の要素:文字列内で最も多く連続して登場する文字2つ目の要素:その文字が連続して登場した回数解決のアプローチこの問題は、文字列を先頭から1文字ずつ走査し、隣接する文字同士を比較することで解決できます。同じ文字が続いている間はカウントを増やし、異なる文字が出現した時点でカウントをリセットします。その際、これまでに記録した最大連続回数を上回っていれば、その文字と回数を結果として保存していきます。コード例以下が実際のコードです。c