当前位置: 首页 > article >正文

力扣 螺旋矩阵-54

螺旋矩阵-54

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size(),n = matrix[0].size();//数组的行列大小
        int top=0,down=m-1,left = 0,right = n-1;//分别为矩阵上下左右的边界
        int index = 0;//存放结果数组的索引
        vector<int>nums(m*n);//用来存放结果
        while(index<m*n)
        {
            for(int i = left;i<=right;i++)//向右遍历
            {
                nums[index++] = matrix[top][i];
            }
            ++top;//向右遍历之后矩阵当前层最上面一行就不需要再遍历,所以++top
            for(int i = top;i<=down;i++)//向下遍历
            {
                nums[index++] = matrix[i][right];
            }
            --right;//向下遍历之后矩阵当前层最右面一行就不需要再遍历,所以--right
            if(top<=down)//不加if判断的话就会发生重遍历或者访问越界错误
            {
                for(int i = right;i>=left;i--)//向左遍历
                {
                nums[index++] = matrix[down][i];
                }
                --down;//向左遍历之后矩阵当前层最下面一行就不需要再遍历,所以--down
            }
            if(left<=right)//不加if判断的话就会发生重遍历或者访问越界错误
            {
                for(int i = down;i>=top;i--)//向上遍历
                {
                nums[index++] = matrix[i][left];
                }
                ++left;//向上遍历之后矩阵当前层最左面一行就不需要再遍历,所以++left
            }
            
        }
        return nums;
    }
};

每日问题

什么是封装性?C++中如何实现封装? 封装性的好处是什么?

什么是封装性?

封装(Encapsulation)是面向对象编程(OOP)的四大基本特性之一,指的是将数据(成员变量)和操作数据的方法(成员函数)结合在一起,并对外界隐藏数据的具体实现细节,只暴露接口供外界访问和操作。

简单来说,封装就是“把数据和操作数据的代码捆绑在一起,并通过公开的接口与外界进行交互”。它帮助隐藏对象的内部实现细节,使得外部只能通过提供的接口与对象交互,而不能直接访问对象的内部数据。

C++中如何实现封装?

C++通过使用类(class)和访问控制修饰符(如 private、protected 和 public)来实现封装。

        1.private: 该访问控制修饰符下的成员只能被类的成员函数访问,不能被类外部的代码直接访问。

        2.protected: 该访问控制修饰符下的成员可以在类的成员函数中访问,也可以在继承该类的派生类中访问。

        3.public: 该访问控制修饰符下的成员可以被任何外部代码访问。

通过将数据成员设为 private,并通过 public 成员函数访问和修改这些数据成员,C++ 实现了封装性。

示例代码:
#include <iostream>
using namespace std;

class BankAccount {
private:
    // 账户余额是私有的,外部无法直接访问
    double balance;

public:
    // 构造函数初始化余额
    BankAccount(double initialBalance) {
        if (initialBalance >= 0)
            balance = initialBalance;
        else
            balance = 0;
    }

    // 公共方法,用于存款
    void deposit(double amount) {
        if (amount > 0)
            balance += amount;
        else
            cout << "Deposit amount must be positive!" << endl;
    }

    // 公共方法,用于取款
    void withdraw(double amount) {
        if (amount > 0 && amount <= balance)
            balance -= amount;
        else
            cout << "Invalid withdrawal amount!" << endl;
    }

    // 公共方法,用于获取余额
    double getBalance() const {
        return balance;
    }
};

int main() {
    BankAccount account(1000);  // 创建账户并初始化余额为1000

    cout << "Initial balance: " << account.getBalance() << endl;

    account.deposit(500);  // 存款500
    cout << "After deposit: " << account.getBalance() << endl;

    account.withdraw(200);  // 取款200
    cout << "After withdrawal: " << account.getBalance() << endl;

    account.withdraw(1500);  // 试图取款超过余额
    cout << "After invalid withdrawal: " << account.getBalance() << endl;

    return 0;
}

在上面的代码中:

balance 是私有的 (private),外部代码无法直接修改账户余额。

deposit()、withdraw() 和 getBalance() 是公有的 (public),外部可以通过它们访问和修改余额。

通过 deposit() 和 withdraw() 控制存款和取款的逻辑,从而避免了不合法的操作(例如取款超过余额)。

封装性的好处:

1.数据隐藏(信息隐藏):

封装使得对象的内部实现细节对外部隐藏,外部无法直接访问和修改对象的状态。这可以防止外部代码直接改变对象的关键数据,保护数据的安全性。

2.提高代码的安全性:

通过封装,开发人员可以确保数据只能通过特定的方法访问或修改,避免了错误的操作(例如直接修改余额)导致程序出现不可预测的行为。

3.代码的可维护性和可扩展性:

封装使得类的实现细节与外部代码解耦。这样,修改类的内部实现时,外部代码不需要做修改,只要接口不变,外部代码可以继续工作。因此,封装有助于提升代码的可维护性和可扩展性。

4.减少代码耦合:

外部代码只能通过类提供的公有接口与对象交互,减少了外部对内部实现的依赖,从而减少了代码耦合度,增加了系统的灵活性。

5.易于调试和测试:

由于类的内部数据不被外部直接访问,数据的访问和修改通过公有函数进行,可以方便地在函数内部加入检查机制,保证数据的有效性和正确性。同时,封装也便于对类进行单元测试。

6.抽象性增强:

封装是面向对象的另一项基本特性,它增强了抽象性。通过封装,外部系统只需要关注如何使用类的接口,而不需要了解类的内部实现,进一步增强了代码的抽象性。

总结:

封装是面向对象编程的重要特性,它通过将数据和方法封装在类中,保护数据的安全性、提升代码的可维护性与可扩展性。C++通过访问控制修饰符(private、protected 和 public)实现封装,封装带来的好处包括信息隐藏、数据安全性、代码的可维护性和灵活性等。


http://www.kler.cn/a/430667.html

相关文章:

  • STM32高级 以太网通讯案例2:搭建TCP服务端
  • 计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习
  • Python知识图谱框架
  • IMX芯片启动方式
  • 细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV
  • TLDR:终端命令的简洁百科全书
  • vscode 配置C/C++环境控制台参数
  • 【FLASH、SRAM和DRAM、CISC和RISC、冯诺依曼和哈佛】单片机内存结构的了解
  • 网页核心页面设计(第5章)
  • 给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题
  • Win11家庭版安装Docker,解决engine stopped问题
  • 初始数据结构
  • 电脑文件夹打不开了,能打开但是会闪退,提示“找不到iUtils.dll”是什么原因?
  • 电脑运行时提示“0x80240037”错误,提示安装ie插件或其他微软程序时,报错提示“未指定的错误”是什么原因?以及要怎么解决和预防?
  • AUTOSAR AP和CP的安全要求规范(Safety Req)详细解读
  • SQL注入--堆叠注入
  • [漏洞挖掘与防护] 05.CVE-2018-12613:phpMyAdmin 4.8.1后台文件包含缺陷复现及防御措施
  • 【Java EE】Spring请求如何传递参数详解
  • Mac电脑钓鱼到拿下核心权限
  • GC常见垃圾回收算法,JVM分代模型
  • 鸿蒙手机文件目录
  • k8s配置Pod 优先级
  • Python爬虫——HTML中Xpath定位
  • 基于单片机控制的多功能智能语音风扇
  • 幼儿园学校养老院供电安全解决方案
  • MongoDB change stream实战