Day 14周二

Day 14周二

每日算法

题目1

反转字符串

妈的这个代码我刚刚开始看了半天,想着,里面的那个reverse为什么就不反转啊,结果是我sb了,那个for循环的括号没有把start = i + 1;给包含进去,找个start根本一直都是在i的后面,我真的服了我去

class Solution {
public:string reverseWords(string &s) {RemoveSpace(s);Reverse(s, 0, s.size()-1);int start = 0;for (int i = 0; i <= s.size(); ++i){if (i == s.size() || s[i] == ' ') //Reverse(s, start, i - 1);//start = i + 1; //start指向了下一个元素的开头//所以这里有应该是加上一个{}{Reverse(s, start, i - 1);start = i + 1;}}return s;}private:void Reverse(string &s, int left, int right){for (int i = left, j = right; i < j; i++, j--){swap(s[i], s[j]);}}void RemoveSpace(string& s){ int slowIndex = 0;for (int fastIndex=0; fastIndex < s.size(); fastIndex++){if (s[fastIndex] != ' '){if (slowIndex != 0)   s[slowIndex++] = ' ';while (fastIndex < s.size() && s[fastIndex] != ' '){s[slowIndex++] = s[fastIndex++];}}}s.resize(slowIndex);}
};
  1. 队列实现栈

在C++中,栈和队列不算是容器,更多的应算上是容器适配器,因为他们底层默认都是双向队列实现的,对一些功能进行限制,封装成为了栈和队列的形式。

在这里用的是双队列的方式来实现的

class MyStack {
public://一个队列用来存放数据,一个队列用来备份数据queue<int> que1;queue<int> que2;MyStack() {}void push(int x) {que1.push(x);}int pop() {int size = que1.size();size--;while(size--){//把que1中的所有元素都弹到que2中,然后只留下一个元素即可int res1 = que1.front();que2.push(res1);que1.pop();}int res = que1.front();que1.pop();que1 = que2;while(!que2.empty()){que2.pop();}return res;}int top() {return que1.back();}bool empty() {return que1.empty() && que2.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

括号的匹配

#include <stack>
class Solution {
public:bool isValid(string s){//关于匹配的问题,都可以判断奇偶性if (s.size() % 2 == 1) return false;stack<char> sta;for (size_t i = 0; i < s.size(); i++){//判断是否是左括号if (s[i] == '(') sta.push(')');else if (s[i] == '{') sta.push('}');else if (s[i] == '[') sta.push(']');//如果不是左括号,是右括号的情况下//1. 如果我们的栈为空了,但是现在我们还是有右括号,说明右括号多了//2. 如果我们当前的右括号和栈中的不匹配,说明是左括号多了else if (sta.empty() || sta.top() != s[i])    return false;//3. 这个时候说明是相等的else sta.pop();}//此时我们遍历完了这个字符串,如果队列为空,说明我们的括号是刚好匹配的//如果我们的栈中还是有元素的,就说明左括号是多的return sta.empty();}
};

设计模式

最好这两天就可以吧设计模式的内容全部都第一次初步的过一遍

工厂设计模式

1.提供一个抽象工厂类 :所有具体工厂类的父类

2.提供与产品对应的工厂类:负责实例化产品对象

3.提供一个抽象产品类: 所有产品的父类

4.提供一个或多个产品类:工厂方法模式所创建的具体实例对象

#include <iostream>
using namespace std;
class AbstractProduct
{
public:virtual void makeProduct() = 0;
};class AbstractFactory
{
public:virtual AbstractProduct* createProduct() = 0;
};class PlaneProduct :public AbstractProduct
{
public:void makeProduct(){cout << "造飞机....." << endl;}
};class PlaneFactory :public AbstractFactory
{
public:AbstractProduct* createProduct(){AbstractProduct* product = new PlaneProduct;return product;}
};class RocketProduct :public AbstractProduct
{
public:void makeProduct(){cout << "造火箭...." << endl;}
};class RocketFactory :public AbstractFactory
{
public:AbstractProduct* createProduct(){AbstractProduct* product = new RocketProduct;return product;}
};int main()
{//造飞机AbstractFactory* factory = new PlaneFactory;AbstractProduct* product = factory->createProduct();product->makeProduct();//造火箭factory = new RocketFactory;product = factory->createProduct();product->makeProduct();return 0;
}

抽象工厂模式

//工厂模式
//抽象产品,总的
class Product
{
public:virtual void show() = 0;
};//抽象产品族 1,表示为键盘
class KeyBoard : public Product{};//具体产品 1 
class LogicalKeyBoard : public KeyBoard
{
public:void show(){std::cout << "这是逻辑键盘" << char(10);}
};class LeiSheKeyBoard : public KeyBoard
{
public:void show(){std::cout << "这雷蛇键盘" << char(10);}
};//抽象产品族2 
class Mouse :public Product{};//具体产品2
class LogicalMouse :public Mouse
{
public:void show(){std::cout << "这是逻辑的鼠标" << char(10);}
};class LeiShelMouse :public Mouse
{
public:void show(){std::cout << "这是雷蛇的鼠标" << char(10);}
};//抽象工厂
//在这个抽象工厂中定义两个纯虚函数,这两个函数是用来创建产品的
class AbstractFactory
{
public:virtual  KeyBoard* createKeyBoard() = 0;virtual  Mouse* createKeyMouse() = 0;
};//具体工厂
//逻辑工厂
class LogicalFactory:public AbstractFactory
{
public:KeyBoard* createKeyBoard(){std::cout << "逻辑工厂制造了产品:逻辑键盘" << char(10);return new LogicalKeyBoard;}Mouse* createKeyMouse(){std::cout << "逻辑制造了产品:逻辑鼠标" << char(10);return new LogicalMouse;}
};class LeiSheFactory : public AbstractFactory
{
public:KeyBoard* createKeyBoard(){std::cout << "雷蛇工厂制造了产品:雷蛇键盘" << char(10);return new LeiSheKeyBoard;}Mouse* createKeyMouse(){std::cout << "雷蛇工厂制造了产品:雷蛇鼠标" << char(10);return new LeiShelMouse;}
};int main()
{//通过抽象工厂的指针来指向一个具体的工厂,来调用具体工厂里面的方法AbstractFactory* factory = new LogicalFactory;KeyBoard* key = factory->createKeyBoard();Mouse* mouse = factory->createKeyMouse();key->show();mouse->show();delete factory;delete key;delete mouse;//再一次创建的时候,需要把new出来的指针进行置空的处理factory = new LeiSheFactory;key = factory->createKeyBoard();mouse = factory->createKeyMouse();key->show();mouse->show();delete factory;delete key;delete mouse;factory = nullptr;key = nullptr;mouse = nullptr;return 0;
}

Day 15 周三

每日算法

删除字符串中的重复字符

#include <stack>
using namespace std;
class Solution {
public:void Reverse(string &s){for(int i = 0,j = s.size()-1;i<j;i++,j--){swap(s[i],s[j]);}}string removeDuplicates(string s){stack<char> sta{};string result{};for (int i = 0; i < s.size(); i++){if (sta.empty() || sta.top()!=s[i]){sta.push(s[i]);}else{sta.pop();}}//再这里把栈中的元素传入while (!sta.empty()){result += sta.top();sta.pop();}Reverse(result);return result;}
};

逆波兰求表达式

自己第一次写的时候出现了发现结果总是对不上,检查了逻辑是发现没有任何的问题的

打了断点去看函数里面的返回结果,发现result里面的返回结果是0,是传入的num的数值是错误的

#include<stack>
using namespace std;
class Solution {
public://如果一个计算机逻辑是没有问题的话,我们可以考虑一下是否是数值的传入顺序的问题long long Culute(string &fuhao,long long &num1,long long &num2){int result = 0;if (fuhao == "+")   result = (num1 + num2);else if (fuhao == "-")   result = (num1 - num2);else if (fuhao == "*")   result = (num1 * num2);else  result = (num1 / num2);return result;}int evalRPN(vector<string>& tokens){if (tokens.size() == 0)  return 0;stack<long long> sta;for (int i = 0; i < tokens.size(); i++){if (tokens[i] == "+" || tokens[i] == "-"|| tokens[i] == "*" || tokens[i] == "/"){long long num1 = sta.top();sta.pop();long long num2 = sta.top();sta.pop();long long push_value = Culute(tokens[i],num1,num2);sta.push(push_value);//sta.push( Culute(tokens[i],num1,num2) );}else{//把数字存放到栈当中去sta.push(stoll(tokens[i]));}}long long result = sta.top();sta.pop();return result;}
};int main()
{Solution s;vector<string> tokens;tokens.push_back("4");tokens.push_back("13");tokens.push_back("5");tokens.push_back("/");tokens.push_back("+");s.evalRPN(tokens);return 0;
}

239滑动窗口的最大值

代码的逻辑应该是没有什么问题的,只是Leetcode里面超时了

class Solution {
public:int FindMax(vector<int>& nums,int start,int end){int max = INT_MIN;for (int i = start; i <= end && i < nums.size(); i++){if (nums[i] > max){max = nums[i];}}std::cout << max << char(10);return max;}vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;for (int left = 0, right = k - 1; right <= nums.size()-1; left++, right++){int max = FindMax(nums, left, right);result.push_back(max);}return result;}
};

为什么析构函数要是虚函数

  • 将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。

原型模式

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,简单理解就是“克隆指定对象

  1. 提供一个抽象原型类:规定了具体原型对象必须实现的接口。
  2. 提供多个具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 提供访问类:使用具体原型类中的 clone() 方法来复制新的对象。
//原型模式
#include <iostream>
#include <string>
using namespace std;//提供一个抽象的类
class  Monkey 
{
public:Monkey() = default;virtual ~Monkey() = default;virtual Monkey* Clone() = 0;virtual void Play() = 0;
};//定义的一个具体的类
class SunWuKong:public Monkey
{
public:~SunWuKong() {};SunWuKong(string m_name){name = m_name;}//拷贝构造函数SunWuKong(const SunWuKong &other){//因为这里不涉及到深拷贝的内容,所以就是简单的浅拷贝赋值操作name = other.name;}Monkey* Clone() {//调用拷贝构造函数return new SunWuKong(*this);}void Play(){std:cout << name << "调用成功了哦" << char(10);}
private:string name;
};int main()
{//父类的指针指向子类Monkey* monkey = new SunWuKong("美猴王齐天大圣");//相当于我创建的这两个克隆都是齐天大圣Monkey* Kelong1 = monkey->Clone();Monkey* Kelong2 = monkey->Clone();Kelong1->Play();Kelong2->Play();Monkey* Kelong3 = Kelong1->Clone();Kelong3->Play();return 0;
}

创建模式的总结

工厂模式: 就是单个类的创建工作

抽象工厂模式:多个类的创建工作

单例模式:类的全局对象创建工作

建造者模式:复杂类的对象创建工作

原型模式:自身类的克隆模式

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

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

相关文章

主从同步机制

RocketMQ的Broker分为Master和Slave两个角色&#xff0c;为了保证高可用性&#xff0c;Master角色的机器接收到消息后&#xff0c;要把内容同步到Slave机器上&#xff0c;这样一旦Master宕机&#xff0c;Slave机器依然可以提供服务。下面分析Master和Slave角色机器间同步功能实…

Nature子刊最新研究:Hi-C宏基因组揭示土壤-噬菌体-宿主相互作用

土壤中有大量的噬菌体。然而&#xff0c;大多数宿主未知&#xff0c;无法获得其基因组特征。2023年11月23日&#xff0c;最新发表于《Nature communications》期刊题为“Hi-C metagenome sequencing reveals soil phage–host interactions”的文章&#xff0c;通过高通量染色体…

2023 最新版navicat 下载与安装 步骤及演示 (图示版)

2023 最新版navicat 下载与安装 步骤演示 -图示版 1. 下载Navicat2 .安装navicat 160 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c…

?.的用法

使用场景&#xff1a; undefined和null是两个比较特殊的数据类型,是不能用点操作符去访问属性的&#xff0c;否则将会报错。 空值合并操作符?? 使用 ?? 时用于提供默认值&#xff0c;只有当左侧表达式的结果为 null 或 undefined 时&#xff0c;才会返回右侧表达式的值。 …

时钟控制模块

时钟控制模块 锁相环电路简单的理解 https://www.bilibili.com/video/BV1yS4y1n7vV/?spm_id_from333.337.search-card.all.click&vd_source712cdb762d6632543eeeadb56271617a一 时钟是从哪里来的 时钟晶振&#xff08;32.768KHz&#xff09;供给RTC使用在IMX6ULL的T16和…

计算机图形学:直线的扫描转换算法解析与实现

直线的扫描转换&#xff1a; DDA算法&#xff1a; 推理&#xff1a; 在计算机显示图形时&#xff0c;由于显示计算机的分辨率是有限的所以我们在绘制图形时需要将图形从连续量转换成离散量才能完成图形的绘制&#xff0c;直线的扫描转换就是将连续量转换为离散量的过程。 对…

wsj0数据集原始文件.wv1.wv2转换成wav文件

文章目录 准备一、获取WSJO数据集二、安装sph2pipe三、转换代码四、结果展示 ​ 最近做语音分离实验需要用到wsj0-2mix数据集&#xff0c;但是从李宏毅语音分离教程里面获取的wsj0-2mix只有一部分。从网上获取到了完整的WSJO数据集后&#xff0c;由于原始的语音文件后缀是wv1或…

【前端】JS实现SQL格式化

sqlFormatter sql-formatter - npm (npmjs.com) const sqlFormatter require(/utils/sqlFormatter)let sql select count(1) as cnt from t_user where id < 7;// 格式化 // let sqlF sqlFormatter.format(sql);let sqlF sqlFormatter.format(sql, {language:mysql,})…

怎么在NAS里找照片?教你一招,精准定位

每次拍照 咔咔一顿拍 好多文档 咔咔一顿存 需要到的时候 却依稀只记得时间和部分关键词 那么怎么快速在NAS里精准定位 找到“命中注定”的它呢 嘿还真有 铁威马的Terra Search 精准搜索 快速定位 So easy&#xff01; 01 什么是Terra Search Terra Search 通过建立数据…

中国信通院发布《中国算力发展指数白皮书》(2023)

加gzh“大数据食铁兽”&#xff0c;回复“20231129”&#xff0c;获取材料完整版 导读 2023 年白皮书在 2022 年的基础上&#xff0c;加强了全球和我国算力发展的研究&#xff0c;客观评估我国整体、各省份及各城市现阶段的算力发展水平进一步给出我国算力二十强市榜单&…

网关路由器双栈配置中的IPv6相关选项解析

1、引言 讲知识往往是枯燥无味的&#xff0c;我们先从问题入手。家庭网关&#xff08;光猫&#xff09;、路由器是我们每个人或多或少都有所接触的2种设备。现在一般都是光纤入户&#xff0c;通常每个家庭配备一个光猫和一台家用路由器。 目前有许多网络服务已经提供了IPv6支…

ASUS(华硕) B760M-AYW WIFI D4_解决wifi不能使用

1、最近新购买了一套 diy电脑主机&#xff0c;选用的是 ASUS B760M-AYW WIFI D4电脑主板 win10 系统&#xff0c;到货后 发现右下角电脑图标处及网络适配器中 没有wifi选项 首先 在官网和旗舰店客服处&#xff0c;确认了 该主板 有集成wifi模块&#xff0c;鲨鱼鳍天线未安装…

Motion Plan之带动力学约束路径搜索

Motion Plan之搜索算法笔记 Motion Plan之基于采样的路径规划算法笔记 为什么要动力学规划&#xff1a; 前面几章介绍的路径规划&#xff0c;我们只是认为机器人是质点&#xff0c;这节课要说的就是&#xff0c;如何在考虑机器人的运动学模型下再去找一个安全可行的路径。考虑…

C#学习相关系列之abstract和virtual用法

一、abstract抽象类用法 1、抽象类的用途 一个类设计的目的是用来被其他类继承的&#xff0c;它代表一类对象的所具有的公共属性或方法&#xff0c;那么这个类就应该设置为抽象类。 抽象类是一种特殊的类&#xff0c;它不能被实例化&#xff0c;只能作为基类来派生出其它的具体…

后端项目连接数据库-添加MyBatis依赖并检测是否成功

一.在pom.xml添加Mybatis相关依赖 在Spring Boot项目中&#xff0c;编译时会自动加载项目依赖&#xff0c;然后使用依赖包。 需要在根目录下pom.xml文件中添加Mybatis依赖项 <!-- Mybatis整合Spring Boot的依赖项 --> <dependency><groupId>org.mybatis.s…

JDK 21 虚拟线程相关知识简介

什么是虚拟线程 虚拟线程是一种轻量级线程&#xff0c;也可以称为协程。它是一种抽象的概念&#xff0c;可以理解为在程序中同时执行多个线程的并发执行。虚拟线程是由Java虚拟机&#xff08;JVM&#xff09;来实现的&#xff0c;它并不与特定的操作系统线程绑定&#xff0c;而…

UDP的特点及应用场景

目录 UDP特点 应用场景 总结 User Datagram Protocol&#xff08;UDP&#xff0c;用户数据报协议&#xff09;是互联网协议套件中的一种传输层协议。与TCP不同&#xff0c;UDP是一种无连接的、不可靠的协议。 UDP特点 要知道UDP可以用来做什么&#xff0c;首先我们要知道它…

UE Web Remote Control

前言 最近在研究UE自启WEB服务和网页通信以此来通过网页与UE进行数据交互&#xff0c;这样最好的方式就是可以摒弃掉整个繁琐的通信连接流程如TCP UDP&#xff0c;但是找到的一些方法都不是很适用&#xff0c;尤其是WEBUI这个插件它只适合内嵌到UE本身才能完成交互&#xff0c;…

LeetCode(37)矩阵置零【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 73. 矩阵置零 1.题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]…

仓储货架生产厂家|拥有编码器+激光传感器的海格里斯HEGERLS料箱式四向穿梭车

随着高新科技的迅猛发展&#xff0c;仓储物流行业已慢慢朝着无人化、自动化、智能化、密集化方向快速发展&#xff0c;用户的需求量也随之日益提升。在众多仓储物流设备中&#xff0c;四向穿梭车越来越得到各大中小企业所青睐和投入使用。四向穿梭车不但具有良好的可延性与适配…