【C++】B2101 计算矩阵边缘元素之和


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目背景与描述
    • 题目描述
      • 输入格式
      • 输出格式
      • 输入输出样例
      • 说明与提示
  • 💯分析与解决方案
    • 解法一:我的做法
      • 代码实现
      • 解题思路
      • 优点与局限性
    • 解法二:老师的做法
      • 代码实现
      • 解题思路
      • 优点与局限性
    • 两种方法的对比与优化
      • 优化建议
  • 💯总结


在这里插入图片描述


💯前言

  • 在编程学习的过程中,我们经常会遇到一些基础但极具锻炼意义的题目,它们不仅可以帮助我们巩固对数据结构的理解,还能提升逻辑思维能力。这篇文章以一道求矩阵边缘元素之和的题目为切入点,展开对解题过程的分析。通过对比两种不同的解法,我们将探索从代码实现到优化的全流程,不仅涵盖基本的编程技巧,还会进一步拓展对于内存管理与代码效率的理解。无论你是初学者还是经验丰富的程序员,相信本次讨论都能带给你一些启发。
    C++ 参考手册
    在这里插入图片描述

💯题目背景与描述

本次我们探讨的题目来源于一道经典的编程练习题,具体内容如下:
B2101 计算矩阵边缘元素之和
在这里插入图片描述

题目描述

输入一个整数矩阵,计算位于矩阵边缘的元素之和。

所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。

输入格式

  • 第 1 行包含两个整数,分别为行数 m m m 和列数 n n n,两个整数之间空格隔开。
  • 第 2 行开始有 m m m 行数据,每行包含 n n n 个整数,整数之间空格隔开。

输出格式

  • 输出对应矩阵的边缘元素和。

输入输出样例

输入:

3 3
3 4 1
7 1 1
2 0 1

输出:

15

说明与提示

  1. 1 ≤ m , n ≤ 100 1 \leq m, n \leq 100 1m,n100:保证答案在 int 类型范围内。
  2. 代码在遍历数组的过程中判断属于边缘的元素,仅对数组中的每个元素遍历了一遍,是不会存在重复统计的问题的。

💯分析与解决方案

这个题目考察了矩阵的基本操作和条件判断逻辑,要求高效计算边缘元素的累加和。接下来,我们分别分析两种解决方案:一种是我的做法,另一种是老师的做法,并对两者的实现与思路进行对比。

解法一:我的做法

代码实现

#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];
        }
    }

    int result = 0;
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(i == 0 || i == m - 1 || j == 0 || j == n - 1)
                result += arr[i][j];
        }
    }

    cout << result << endl;
    return 0;    
}

在这里插入图片描述

解题思路

  1. 输入与存储:

    • 首先读取矩阵的行数 m m m 和列数 n n n,并将矩阵存储在一个二维数组 arr 中。
    • 利用嵌套的双重 for 循环,依次读取每个矩阵元素,存储到二维数组的对应位置。
  2. 遍历与条件判断:

    • 使用另一组嵌套的双重 for 循环,对整个矩阵进行逐元素的遍历。
    • 在遍历过程中,通过条件判断是否为矩阵的边缘元素:
      • 边缘元素满足以下任一条件:
        • 第一行: i = = 0 i == 0 i==0
        • 最后一行: i = = m − 1 i == m-1 i==m1
        • 第一列: j = = 0 j == 0 j==0
        • 最后一列: j = = n − 1 j == n-1 j==n1
    • 如果条件成立,将当前元素累加到结果 result 中。
  3. 输出结果:

    • 遍历完成后,输出累加结果 result,即矩阵边缘元素的总和。

优点与局限性

  • 优点:

    1. 逻辑清晰,易于理解:
      • 通过条件判断筛选边缘元素,结构直观。
    2. 矩阵存储方便:
      • 使用二维数组存储矩阵,方便后续操作。
  • 局限性:

    1. 内存占用高:
      • 当矩阵较大(如 100 × 100 100 \times 100 100×100)时,二维数组 arr 需要较大的内存空间,可能造成内存浪费。
    2. 效率有优化空间:
      • 遍历整个矩阵,同时对非边缘元素进行了不必要的条件判断。

解法二:老师的做法

代码实现

#include <iostream>
using namespace std;

int main()
{
    int m, n, t;
    cin >> m >> n;
    int result = 0;
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin >> t;
            if(i == 0 || i == m - 1 || j == 0 || j == n - 1)
                result += t;
        }
    }

    cout << result << endl;
    return 0;    
}

在这里插入图片描述

解题思路

  1. 输入与处理:

    • 通过嵌套 for 循环直接输入矩阵元素,无需存储矩阵。
    • 利用一个临时变量 t,逐一读取每个矩阵元素。
  2. 边缘元素判断与累加:

    • 在输入的同时,通过条件判断是否为矩阵边缘元素:
      • 第一行: i = = 0 i == 0 i==0
      • 最后一行: i = = m − 1 i == m-1 i==m1
      • 第一列: j = = 0 j == 0 j==0
      • 最后一列: j = = n − 1 j == n-1 j==n1
    • 如果是边缘元素,直接累加到结果变量 result 中。
  3. 输出结果:

    • 遍历完成后,直接输出累加结果 result

优点与局限性

  • 优点:

    1. 节省内存:
      • 使用临时变量 t,无需存储整个矩阵,节省了大量内存。
    2. 高效简洁:
      • 避免了对非边缘元素的额外遍历或判断。
    3. 适合特定需求:
      • 如果只需边缘元素的累加和,代码结构最优。
  • 局限性:

    1. 缺乏灵活性:
      • 矩阵未被存储,无法在后续代码中访问或处理矩阵其他元素。
    2. 扩展性较弱:
      • 如果需要对矩阵进行更多复杂操作(如计算特定行的最大值),无法复用输入。

两种方法的对比与优化

比较维度我的做法老师的做法
存储方式使用二维数组存储整个矩阵不存储矩阵,直接用临时变量处理
内存占用较高(需存储 m × n m \times n m×n 个元素)较低(只用一个临时变量 t
代码复杂度逻辑稍复杂,需两次遍历逻辑简单,单次遍历即可完成
适用场景矩阵需多次访问或进一步处理仅需一次性计算边缘元素之和

优化建议

  1. 减少重复判断:

    • 可将边缘元素的处理分为两部分:
      • 第一行和最后一行直接累加。
      • 中间行只处理第一列和最后一列。
    • 示例代码:
    for (int j = 0; j < n; j++) {
        result += arr[0][j];
        if (m > 1) result += arr[m-1][j];
    }
    for (int i = 1; i < m-1; i++) {
        result += arr[i][0];
        if (n > 1) result += arr[i][n-1];
    }
    
  2. 扩展性优化:

    • 如果矩阵需要进一步处理,可以在老师代码的基础上稍作修改,使用动态存储(如 STL 容器 vector)以兼顾灵活性和效率。

💯总结

通过本次讨论,我们深入分析了两个解法的实现逻辑及优劣,并提出了优化建议。老师的做法内存占用低,适用于只需一次计算的场景;而我的做法适合需要存储矩阵、进行后续操作的需求。在编程实践中,应根据具体需求选择最优方案,同时时刻考虑代码的可读性与扩展性。


在这里插入图片描述


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

保护性暂停原理

什么是保护性暂停&#xff1f; 保护性暂停&#xff08;Guarded Suspension&#xff09;是一种常见的线程同步设计模式&#xff0c;常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式&#xff0c;一个线程在执行过程中会检查某个条件是否满…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>字母大小写全排列

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; private List<String> ret;private StringBuffer path;public List<String> letterCasePermutation(String s) {ret new ArrayList<>();path new StringBuffer();dfs(s,0);return ret;}private voi…

解决nginx多层代理后应用部署后访问发现css、js、图片等样式加载失败

一般是采用前后端分离部署方式&#xff0c;被上一层ng代理后&#xff0c;通过域名访问报错&#xff0c;例如&#xff1a;sqx.com.cn/应用代理路径。 修改nginx配置&#xff0c;配置前端页面的路径&#xff1a; location / {proxy_pass http://前端页面所在服务器的IP:PORT;pro…

前端-计算机网络篇

一.网络分类 1.按照网络的作用范围进行分类 &#xff08;1&#xff09;广域网WAN(Wide Area Network) 广域网的作用范围通常为几十到几千公里,因而有时也称为远程网&#xff08;long haul network&#xff09;。广域网是互联网的核心部分&#xff0c;其任务是长距离运送主机…

挑战20天刷完leecode100

2025.1.5 二分查找 1 搜索插入位置 就是简单的二分查找 注意开闭就行 这里有一句话就是nums是升序的 如果他不是严格递增 就是有相同的数字的情况下应该怎么写? int lower_bound(vector<int>& nums, int target) {int left 0, right (int) nums.size() - 1; …

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下&#xff0c;注意&#xff1a;socket 接收信息需要异步运行&#xff1a; // port 端口号自定义一个值&#xff0c;比如 8888&#xff0c;但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…

Linux 获取文本部分内容

Linux获取文本部分内容 前言场景获取前几行内容获取末尾几行内容获取中间内容head 命令 tail 命令 结合sed 命令awk 命令 前言 test.log 文本内容如下&#xff1a; &#xff08;注意&#xff1a;内容 a1004和a1005之间有一空行&#xff09; [rootgaussdb002 tmp]# cat test.…

常见的端口号大全,2025年整理

端口号是网络通信的基础&#xff0c;它定义了不同服务的入口和出口。了解服务端口号不仅有助于网络配置&#xff0c;还能提升问题排查效率。在实际应用中&#xff0c;熟悉常见端口号可以帮助你快速定位网络故障、优化服务性能&#xff0c;并确保网络安全。 一、常见的网络服务…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

【Arthas命令实践】heapdump实现原理

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …

【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)

本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果&#xff1a; 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址&#xff1a;https://qianfan.cloud.baidu.com/ 注册成功后&…

【我的 PWN 学习手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus&#xff0c;进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP &#xff08;…

语音技术与人工智能:智能语音交互的多场景应用探索

引言 近年来&#xff0c;智能语音技术取得了飞速发展&#xff0c;逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制&#xff0c;再到企业客服和教育辅导&#xff0c;语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后&#xff0c;人工智能技术无疑是关键…

三、Angular 路由

一、简介 Angular 的路由服务是一个可选的服务&#xff0c;它用来呈现指定的 URL 所对应的视图。它并不是Angular 核心库的一部分&#xff0c;而是位于 angular/router 包中。像其他 Angular 包一样&#xff0c;路由服务在用户需要时才从此包中导入。 [1]. 创建路由模块 默认…

NFS 组件容器化部署实战指南

文章目录 前言部署NFS服务器K8S部署NFS问题记录 前言 使用nfs-client-provisioner这个应用&#xff0c;利用nfs server给kubernets提供作为持久化后端&#xff0c;并且动态提供pv。所有节点需要安装nfs-utils组件&#xff0c;并且nfs服务器与kubernets worker节点都能网络连通…

uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机上

两个习题 先了解下CPU上函数调用的过程: 一个程序取得函数地址&#xff0c;先保护现场将局部变量及参数压栈&#xff0c;再将调用函数的参数压栈&#xff0c;然后跳转到函数位置&#xff0c;将参数出栈&#xff0c;执行代码&#xff0c;结束后返回到调用位置&#xff0c;再怖复…

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

NLP中常见的分词算法(BPE、WordPiece、Unigram、SentencePiece)

文章目录 一、基本概念二、传统分词方法2.1 古典分词方法2.2 拆分为单个字符 三、基于子词的分词方法&#xff08;Subword Tokenization&#xff09;3.1 主要思想3.2 主流的 Subword 算法3.3 Subword 与 传统分词方法的比较 四、Byte Pair Encoding (BPE)4.1 主要思想4.2 算法过…

MTK平台-- 无线AP隔离功能

前言: 无线AP上大都有一个选项:启用该功能后,连接到同一AP的无线终端之间不能互相通信,但该功能并不限制无线终端和有线终端之间的通信。 Hostapd参数ap_isolate,用于控制AP隔离,但hostapd本身并不实现这一功能,只是将该参数通过nl80211传递给mac80211,由mac80211来实…

redis:安装部署、升级以及失败回退

安装部署 一、准备工作 1. 检查系统要求 确保你的服务器满足 Redis 的基本要求: 操作系统:支持的 Linux 发行版(如 Ubuntu, CentOS)内存:至少 4GB(根据实际应用需求调整)CPU:单核或多核 CPU磁盘空间:足够的磁盘空间用于数据存储和日志记录2. 更新系统软件包 在开始…