566. Reshape the Matrix
Categories:
題目
In MATLAB, there is a handy function called reshape which can
reshape
anm x n
matrix into a new one with a different sizer x c
keeping its original data.
You are given an
m x n
matrix mat and two integersr
andc
representing the number of rows and the number of columns of the wanted reshaped matrix.
The reshaped matrix should be filled with all the elements of the original matrix in the same row-traversing order as they were.
If the
reshape
operation with given parameters is possible and legal, output the new reshaped matrix; Otherwise, output the original matrix.
實現 MATLAB 對於矩陣的 reshape
功能,將 m * n
的矩陣轉換成 r * c
的矩陣,如果無法轉換
,則直接回傳原始的矩陣
會傳入 原始的矩陣 mat
,裡面有 m 列(row) * n 欄(column)
的資料,將它轉換成 r 列(row) * c 欄(column)
的資料
要按照原本的 列(row)
及 欄(column)
的順序做轉換
Example
Input: mat = [[1,2],[3,4]], r = 1, c = 4
Output: [[1,2,3,4]]
Input: mat = [[1,2],[3,4]], r = 2, c = 4
Output: [[1,2],[3,4]]
演算法
1. 計算「來源矩陣」與「目標矩陣」欄位資料是否相符
欄位數量不相符則無法轉換,直接回傳原始矩陣
2. 遍歷整個原始的矩陣,將「原始矩陣」
寫入到「目標矩陣」
從頭到尾遍歷整個 原始矩陣
,由 列(row)
優先遍歷
然後將那個 列(row)
的所有 欄(column)
的資料取出塞到「目標矩陣」
答案
JavaScript
function matrixReshape(originalMatrix, targetRow, targetColumn) {
// 原始矩陣「列 row」的數量
var originalRowCount = originalMatrix.length;
// 原始矩陣「欄 column」的數量
var originalColumnCount = originalMatrix[0].length;
if ((originalRowCount * originalColumnCount) != (targetRow * targetColumn)) {
// 「原始欄位資料數量」與「目標欄位資料數量」不符,無法轉換
return originalMatrix;
}
// 目標矩陣
var targetMatrix = [];
// let targetMatrix: number[][] = new Array();
// 目標「列 row」的數量計數器
var targetRowCounter = 0;
// 目標「欄 column」的數量計數器
var targetColumnCounter = 0;
// 遍歷整個原始的矩陣,將「原始矩陣」寫入到「目標矩陣」
for (var row = 0; row < originalRowCount; row++) {
for (var column = 0; column < originalColumnCount; column++) {
if (!targetMatrix[targetRowCounter]) {
// 如果目標矩陣還沒設定,初始化目標矩陣「列 row」的資料列
targetMatrix[targetRowCounter] = [];
}
// 將目標的「列 row」及「欄 column」的資料寫到目標矩陣位置
targetMatrix[targetRowCounter][targetColumnCounter] = originalMatrix[row][column];
targetColumnCounter++;
if (targetColumnCounter == targetColumn) {
// 如果已經達到目標矩陣數量
// 將目標矩陣的「欄 column」位置重設,重新開始寫入到新的位置
targetColumnCounter = 0;
// 將目標矩陣的「列 row」位置移動到下一個位置
targetRowCounter++;
}
}
}
return targetMatrix;
}
TypeScript
function matrixReshape(originalMatrix: number[][], targetRow: number, targetColumn: number): number[][] {
// 原始矩陣「列 row」的數量
let originalRowCount = originalMatrix.length;
// 原始矩陣「欄 column」的數量
let originalColumnCount = originalMatrix[0].length;
if ((originalRowCount * originalColumnCount) != (targetRow * targetColumn)) {
// 「原始欄位資料數量」與「目標欄位資料數量」不符,無法轉換
return originalMatrix;
}
// 目標矩陣
let targetMatrix: number[][] = [];
// let targetMatrix: number[][] = new Array();
// 目標「列 row」的數量計數器
let targetRowCounter = 0;
// 目標「欄 column」的數量計數器
let targetColumnCounter = 0;
// 遍歷整個原始的矩陣,將「原始矩陣」寫入到「目標矩陣」
for (let row = 0; row < originalRowCount; row++) {
for (let column = 0; column < originalColumnCount; column++) {
if (!targetMatrix[targetRowCounter]) {
// 如果目標矩陣還沒設定,初始化目標矩陣「列 row」的資料列
targetMatrix[targetRowCounter] = [];
}
// 將目標的「列 row」及「欄 column」的資料寫到目標矩陣位置
targetMatrix[targetRowCounter][targetColumnCounter] = originalMatrix[row][column];
targetColumnCounter++;
if (targetColumnCounter == targetColumn) {
// 如果已經達到目標矩陣數量
// 將目標矩陣的「欄 column」位置重設,重新開始寫入到新的位置
targetColumnCounter = 0;
// 將目標矩陣的「列 row」位置移動到下一個位置
targetRowCounter++;
}
}
}
return targetMatrix;
};