题解 | 矩阵转置
矩阵转置
https://www.nowcoder.com/practice/351b3d03e410496ab5a407b7ca3fd841
#include <iostream>
#include <vector>
#include <stdexcept>
// 命名空间隔离:避免全局命名污染
namespace MatrixOperation {
/**
* @brief 矩阵转置函数(n行m列 → m行n列)
* @param n 原矩阵行数
* @param m 原矩阵列数
* @return 转置后的矩阵
*/
std::vector<std::vector<int>> TransposeMatrix(size_t n, size_t m) {
std::vector<std::vector<int>> transposed(m); // 先初始化外层(m行),内层按需扩容
int element;
for (size_t i = 0; i < n; ++i) {
for (size_t j = 0; j < m; ++j) {
if (!(std::cin >> element)) {
throw std::runtime_error(
"Invalid element input at row=" + std::to_string(i) + ", col=" + std::to_string(
j)
);
}
transposed[j].push_back(element); // 列优先赋值,内层按需push_back
}
}
return transposed;
}
} // namespace MatrixOperation
int main() {
// IO加速:适配大数据量输入
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
size_t n, m;
try {
// 校验矩阵行列数合法性
if (!(std::cin >> n >> m) || n < 1 || m < 1) {
throw std::invalid_argument("Matrix size (n,m) must be positive integers");
}
// 调用转置函数(异常由函数抛出,统一捕获)
auto transposed_matrix = MatrixOperation::TransposeMatrix(n, m);
// 输出转置矩阵(解决末尾空格问题)
for (const auto& row : transposed_matrix) {
if (row.empty()) continue;
// 先输出第一个元素,再输出“空格+元素”,避免末尾空格
std::cout << row[0];
for (size_t k = 1; k < row.size(); ++k) {
std::cout << " " << row[k];
}
std::cout << std::endl;
}
} catch (const std::exception& e) {
// 统一异常处理:输出错误信息,异常退出返回1
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
// 正常退出返回0
return 0;
}
优化版