JavaScriptで2次元配列を指定した行数・列数に再形成する方法
問題
JavaScriptの関数を作成します。この関数は、第1引数として数値の2次元配列 arr を受け取り、続く2つの引数として、変換後の行列の行数と列数を表す数値 r および c を受け取ります。
関数は、入力配列と同じ行優先(row-traversing)順序で要素を並べ替えたうえで、指定された行数と列数を持つ新しい2次元配列を生成して返す必要があります。
たとえば、関数への入力が次の場合:
const arr = [ [6, 7], [8, 9] ]; const r = 1, c = 4;
期待される出力は次のとおりです。
const output = [[6, 7, 8, 9]];
出力の解説
arr を行優先で走査すると、[6, 7, 8, 9] という1次元の要素列が得られます。新しい行列は 1×4 のサイズであるため、この要素列を先頭から順に行ごとに埋めていくことで、目的の形状への再形成が完了します。
コード例
以下がその実装です。
const arr = [
[6, 7],
[8, 9]
];
const r = 1, c = 4;
const reshapeArray = (arr, r, c) => {
// 要素の総数が一致しない場合は再形成不可のため元の配列を返す
if (r * c !== arr.length * arr[0].length) {
return arr;
}
const res = [];
let row = [];
arr.forEach(items => items.forEach((num) => {
row.push(num);
if (row.length === c) {
res.push(row);
row = [];
}
}));
return res;
};
console.log(reshapeArray(arr, r, c));処理のポイント
- 整合性チェック: 変換前後で要素の総数(r × c と 元の行数 × 列数)が一致しない場合、再形成は不可能なため元の配列をそのまま返します。これは「Reshape the Matrix」タイプの問題における標準的な要件です。
- フラット化しながら詰め直し: ネストされた
forEachで全要素を走査し、一時的なrow配列へ要素を追加していきます。row.lengthがcに達した時点で、その行を完成したものとして結果に push し、rowを空に戻します。 - 計算量: 各要素を一度ずつ訪れるだけのため、時間計算量は O(m × n)、必要な追加の空間計算量も O(m × n) となります。
実行結果
コンソールには以下のように出力されます。
[[6, 7, 8, 9]]
-
JavaScriptのArray.prototype.map()メソッドの使い方を徹底解説
Array.prototype.map()とは? JavaScriptのArray.prototype.map()メソッドは、配列の各要素に対してコールバック関数を実行し、その戻り値から新しい配列を作成するためのメソッドです。元の配列は変更されないため、安全にデータ変換を行いたい場合に非常に便利です。 構文 arr.map(function callback(currentValue[, index[, array]]) 各引数の意味は以下のとおりです。 currentValue:現在処理している要素の値 index(省略可能):現在処理している要素のインデックス番号 array(省略可能
-
JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介
JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の