【C++】B2106 矩阵转置


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目解析
  • 💯第一种实现方式:我的初始做法
    • 实现思路
    • 优缺点分析
  • 💯第二种实现方式:我的优化做法
    • 实现思路
    • 优缺点分析
  • 💯第三种实现方式:老师的做法
    • 实现思路
    • 优缺点分析
  • 💯对比与优化
    • 对比分析
    • 优化建议
  • 💯总结


在这里插入图片描述


💯前言

  • 在学习 C++ 编程中,矩阵处理是一类非常基础且重要的应用,特别是在数据处理、图像计算和科学计算等领域。矩阵转置作为最简单的矩阵变换之一,是我们需要掌握的基本技能。本次,我们通过一道矩阵转置的题目来深入解析其实现过程和优化方法,同时对比不同的实现方式,提炼出最优解法,并进行适当的知识扩展。
    以下内容包括对题目的解析、两种代码实现的详细讲解、老师的实现方案以及它们的对比分析与优化建议,最终形成一篇完整的矩阵转置解决方案与思路详解。
    C++ 参考手册
    在这里插入图片描述

💯题目解析

B2106 矩阵转置
在这里插入图片描述

题目描述
输入一个 n × m n \times m n×m 的矩阵 A A A,输出它的转置矩阵 A T A^T AT

输入格式

  1. 第一行包含两个整数 n n n m m m,表示矩阵 A A A 的行数和列数。
    • 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100
    • 1 ≤ m ≤ 100 1 \leq m \leq 100 1m100
  2. 接下来 n n n 行,每行 m m m 个整数,表示矩阵 A A A 的元素。相邻两个整数之间用单个空格隔开。

输出格式
输出 m m m 行,每行 n n n 个整数,为矩阵 A A A 的转置。相邻两个整数之间用单个空格隔开。

输入输出样例

  • 输入:

    3 3
    1 2 3
    4 5 6
    7 8 9
    
  • 输出:

    1 4 7
    2 5 8
    3 6 9
    

解析

  • 输入矩阵是一个 3 × 3 3 \times 3 3×3 的矩阵。
  • 转置操作将矩阵的行变为列,列变为行。
  • 转置后的矩阵大小为 3 × 3 3 \times 3 3×3,内容如下:
    1 4 7
    2 5 8
    3 6 9
    

💯第一种实现方式:我的初始做法

#include <iostream>
using namespace std;int arr1[105][105];
int arr2[105][105];
int main()
{int m, n;cin >> m >> n;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){cin >> arr1[i][j];}}for(int j = 0; j < n; j++){for(int i = 0; i < m; i++){arr2[j][i] = arr1[i][j];}}for(int j = 0; j < n; j++){for(int i = 0; i < m; i++){cout << arr2[j][i] << " ";}cout << endl;}return 0;    
}

在这里插入图片描述

实现思路

  1. 定义两个数组
    • arr1 用于存储输入矩阵;
    • arr2 用于存储转置后的矩阵。
  2. 输入矩阵
    • 通过嵌套循环将矩阵的每个元素按行存储到 arr1 中。
  3. 进行转置
    • 遍历矩阵元素,按公式 A T [ j ] [ i ] = A [ i ] [ j ] A^T[j][i] = A[i][j] AT[j][i]=A[i][j] 填充转置矩阵 arr2
  4. 输出转置矩阵
    • 遍历 arr2,逐行输出。

优缺点分析

优点:

  • 思路清晰,逻辑简单,易于理解。
  • 使用两个数组分离输入矩阵与输出矩阵的存储,代码结构清晰。

缺点:

  • 使用了两个二维数组,增加了额外的空间开销。
  • 输出逻辑未处理行末多余的空格。

💯第二种实现方式:我的优化做法

#include <iostream>
using namespace std;int arr[105][105];
int main()
{int m, n;cin >> m >> n;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){cin >> arr[i][j];}}for(int j = 0; j < n; j++){for(int i = 0; i < m; i++){cout << arr[i][j] << " ";}cout << endl;}return 0;    
}

在这里插入图片描述

实现思路

  1. 省略了 arr2 数组,直接利用 arr 进行转置。
  2. 输出时按转置逻辑直接从 arr 中读取数据。
  3. 输出矩阵时直接打印转置后的值,无需额外存储。

优缺点分析

优点:

  • 相比第一种实现方式,节省了额外的数组存储空间。
  • 代码更加简洁,减少了不必要的变量定义。

缺点:

  • 同样未处理行末多余空格的问题。

💯第三种实现方式:老师的做法

#include <iostream>
using namespace std;const int N = 110;
int arr[N][N];
int m, n;int main()
{cin >> m >> n;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){cin >> arr[i][j];}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cout << arr[j][i] << " ";}cout << endl;}return 0;
}

在这里插入图片描述

实现思路

  1. 定义了常量 N = 110,设置矩阵的最大边界,确保足够空间存储矩阵。
  2. 使用全局变量 arr 存储矩阵,避免在函数内部重复定义。
  3. 输入矩阵后,直接利用转置逻辑输出矩阵,无需额外数组存储。

优缺点分析

优点:

  • 与第二种实现方式相似,同样节省了空间,直接利用输入数组进行转置。
  • 利用全局变量的方式,使得代码简洁易读,输入输出逻辑分明。

缺点:

  • 同样存在输出行末多余空格的问题。
  • 全局变量在复杂程序中可能引入意外的副作用。

💯对比与优化

对比分析

实现方式空间复杂度时间复杂度易读性可优化点
第一种实现 O ( n × m ) O(n \times m) O(n×m) O ( n × m ) O(n \times m) O(n×m)简单明了减少空间使用
第二种实现 O ( 1 ) O(1) O(1) O ( n × m ) O(n \times m) O(n×m)更简洁修复多余空格
第三种实现 O ( 1 ) O(1) O(1) O ( n × m ) O(n \times m) O(n×m)清晰规范避免全局变量

优化建议

  1. 去除行末多余空格:
    输出逻辑可以通过条件判断避免行末多余空格:

    for (int j = 0; j < m; j++)
    {cout << arr[j][i];if (j < m - 1) cout << " ";
    }
    
  2. 输入输出优化:
    在大数据量场景下,可以使用 scanfprintf 提高效率:

    scanf("%d %d", &m, &n);
    for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)scanf("%d", &arr[i][j]);
    
  3. 避免全局变量:
    将全局变量 arr 改为局部变量,增强程序模块化能力。


💯总结

  • 在这里插入图片描述
    通过对这道矩阵转置题目的深入剖析,我们学习了三种不同的实现方法及其优缺点。随着实现方式的优化,我们逐渐减少了空间开销,使代码更高效简洁。最终,我们可以在满足题目要求的基础上,进一步提高代码的鲁棒性和扩展性。这类问题的解决,不仅让我们理解了矩阵操作的基本原理,也锻炼了对代码优化的思考能力。

在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/504192.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xxl-job回调执行器,发生NPE空指针异常

一、背景 xxl-job管理后台报错&#xff1a; 22:33:26.615 logback [http-nio-8090-exec-9] ERROR c.x.j.a.c.r.WebExceptionResolver - WebExceptionResolver:{} java.lang.NullPointerException: nullat com.xxl.job.admin.service.impl.AdminBizImpl.callback(AdminBizImpl…

UE 5.3 C++ 管理POI 如何对WidgetComponent 屏幕模式进行点击

一.首先对很多对 World 模式下的点击&#xff0c;选择接受 硬件输入&#xff0c;就可以实现点击。 二。Screen 模式下&#xff0c;的POI。如果想要点击&#xff0c; 设置好 Layers。 在Widget下&#xff0c;加个Button。 即使上面有其他&#xff0c;但也能点击到。 。 如果相…

CDP集成Hudi实战-Hive

[〇]关于本文 本文测试一下使用Hive和Hudi的集成 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]部署Jar包 1-部署hudi-hive-sync-bundle-1.0.0.jar文件 [rootcdp73-1 ~]# for i in $(se…

腾讯云AI代码助手编程挑战赛——智能音乐推荐系统

作品简介 智能音乐推荐系统是一种利用人工智能和数据分析技术&#xff0c;根据用户的音乐偏好来推荐音乐的系统。 它主要基于用户的历史收听记录&#xff0c;如歌曲、专辑、歌手的收藏和播放次数等数据进行分析。同时也会考虑用户的基本信息&#xff0c;像年龄、性别等可能和…

在JavaScript开发中,如何判断对象自身为空?

前言 如何判断一个对象为空是我们在开发中经常会遇到的问题&#xff0c;今天我们来聊聊几种经常使用的方法&#xff0c;以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化&#xff0c;转为相应的 JSON 格式。 const obj {};cons…

SpringCloud系列教程:微服务的未来(十)服务调用、注册中心原理、Nacos注册中心

本博客将重点介绍服务调用和注册中心的原理&#xff0c;特别是以 Nacos 为例&#xff0c;详细讲解 Nacos 注册中心如何实现服务的注册与发现。同时&#xff0c;分析 Nacos 注册中心在分布式微服务中的应用&#xff0c;帮助开发者更好地理解其工作机制。 目录 前言 微服务拆分…

NRC优先级中比较特殊的—NRC0x13和NRC0x31

1、基础知识 大家都了解 NRC0x13&#xff0c;表示长度错误和格式错误 NRC0x31&#xff0c;表示DID不支持和数据格式不支持 2、为什么说这两个NRC比较特殊 看下图的标注部分&#xff1a; 2.1、先看NRC0x13 步骤一&#xff1a;仔细看是先判断Minmun Length Check &#xff0…

Redis 笔记(二)-Redis 安装及测试

一、什么是 Redis 中文网站 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用 ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value&#xff0c;并提供多种语言的 API。 Redis 开源&#xff0c;遵循 BSD 基…

eNSP之家——路由器--入门实例详解

eNSP路由器配置&#xff1a;IP、DHCP与DNS详解-CSDN博客 练习1&#xff1a;两个路由器配置ip地址&#xff0c;并用ping命令测试连通性。 打开ensp&#xff0c;拉进来两个路由器AR2220,再用auto连接两个路由器。 选中两个路由器&#xff0c;右键启动&#xff0c;等待半分钟路由…

Electron快速入门——跨平台桌面端应用开发框架

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

机器学习基础-机器学习的常用学习方法

目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…

Qt QDockWidget详解以及例程

Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列)&#xff0c;也可以作为QMainWindow上的顶级窗口浮动 (类似一…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…

【Linux 之 二十 】使用 ln 命令创建符号链接

ln&#xff08;英文全拼&#xff1a;link files&#xff09;是Linux中非常重要的一个命令&#xff0c;用创建一个硬链接或者一个符号链接&#xff08;也叫软链接&#xff09;。它的功能是为某一个文件或目录在另外一个位置建立一个同步的链接。当我们需要在多个目录下都能显示某…

B树及其Java实现详解

文章目录 B树及其Java实现详解一、引言二、B树的结构与性质1、节点结构2、性质 三、B树的操作1、插入操作1.1、插入过程 2、删除操作2.1、删除过程 3、搜索操作 四、B树的Java实现1、节点类实现2、B树类实现 五、使用示例六、总结 B树及其Java实现详解 一、引言 B树是一种多路…

Nature Electronics——近传感器计算:50 nm异构集成技术的革命

创新点&#xff1a;1.高密度互联设计&#xff1a;基于二维材料&#xff0c;开发出互连密度高达62,500 I/O每平方毫米的M3D集成结构。2.异构层堆叠&#xff1a;整合了第二层石墨烯化学传感器和第一层MoS₂记忆晶体管&#xff0c;实现功能互补。3.超短传感器与计算元件距离&#…

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…

江科大STM32入门——IIC通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 &#xff08;一&#xff09;简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 支持多主机 支持7位/10位地址模式 支持不同的通讯速…

vue2日历组件

这个代码可以直接运行&#xff0c;未防止有组件库没安装&#xff0c;将组件库的代码&#xff0c;转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…

Java语法总结

Java的数据类型分为基本数据类型和引用数据类型。 1.基本数据类型&#xff1a;四类八种 byte 和short 比较特殊&#xff0c;不必考虑int类型&#xff0c;只关注是否超出了表示范围。 数据超出了int的范围&#xff0c;改正&#xff1a;在后边添加L &#xff0c;定义变量报错…