Day 12 周日和周一

每日博客Day 12

每日算法

三数之和

这个代码是肯定跑不了的,但是我个人最开始的想法确实是差不多这个样子的


class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//两层for循环来确定a+b的数值,然后再去哈希表中查找 是否存在另外一个数值unordered_set<int> set_find;vector<int> res2;vector<vector<int>> res;for (int num : nums){set_find.insert(num);}int temp = 0;for (int i = 0; i < nums.size(); i++){for (int j = i+1; j < nums.size(); j++){temp = nums[i] + nums[j];int find_value = 0 - (temp);if (set_find.find(find_value) != set_find.end()){res2.push_back(nums[i]);res2.push_back(nums[j]);res2.push_back(find_value);res.push_back(res2);}}}return res;}
};

我感觉这个题目如果使用哈希表来做有点难,主要是去重操作,自己代码搞了半天我还不知道自己哪里有问题,感觉还是比较麻烦的。

那个哈希表的创建还要在找到了去重了a之后再去创建,感觉有点难理解

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++){if (nums[i] > 0)	return res;if (i > 0 && nums[i] == nums[i - 1] )	continue; unordered_set<int> m_set;for (int j = i + 1; j < nums.size(); j++){if (j > i + 2&& nums[j] == nums[j - 1]&& nums[j - 1] == nums[j - 2]) {continue;}int find_c = 0 - (nums[i] + nums[j]);if (m_set.find(find_c) != m_set.end()){res.push_back({ nums[i],nums[j],find_c });m_set.erase(find_c);	//对c的去重操作}else{m_set.insert(nums[j]);	}}}return res;}
};
利用双指针方式
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++){if (nums[i] > 0)	return res;//i-1这个判断肯定是要放在后面的位置的,因为当i=0的时候会出现越界的情况if (i > 0 && nums[i] == nums[i - 1]) continue;//此时确定了i的位置,要去寻找left和right的位置int right = nums.size() - 1;int left = i + 1;if(left == right)   return res;while (right > left){if (nums[i] + nums[left] +nums[right] > 0)	right--;else if (nums[i] + nums[left] +nums[right] < 0)	left++;else{res.push_back({ nums[i],nums[left],nums[right] });while (right > left && nums[right] == nums[right - 1])	right--;while (right > left && nums[left] == nums[left + 1])	left++;right--;left++;}}}return res;}
};

四数之和

看了时评的讲解之后会感觉,没有什么特别难的感觉,就是在运行的时候要注意数据的大小范围,要加上long的范围

虽然代码数量看着比较多,但是理解代码的思路之后其实感觉其实还好,continue和break的使用要注意

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target){vector<vector<int>> result;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++){if (nums[i] > target && target >= 0)	break;if (i > 0 && nums[i] == nums[i - 1])	continue;for (int j = i + 1; j < nums.size(); j++){if ((nums[i] + nums[j]) > target && target > 0)	break;if (j > i + 1 && nums[j] == nums[j - 1])	continue;int left = j + 1;int right = nums.size()-1;while (left < right){if ((long)nums[i] + nums[j] + nums[left] + nums[right] > target)	right--;else if ((long)nums[i] + nums[j] + nums[left] + nums[right] < target) left++;else{result.push_back(vector<int>{ nums[i],nums[j],nums[left],nums[right] });while (right > left && nums[right] == nums[right - 1])	right--;while (right > left && nums[left] == nums[left + 1])	left++;left++;right--;}}}}return result;}
};

明天的时候再写一个总结,今天先简单的看一下哈希表的总结内容即可

得到0的操作数

直接无脑模拟就可以了,两个正整数是一定可以相减为0的

class Solution {
public:int countOperations(int num1, int num2) {int count =  0;while(num1 && num2){count++;if(num1 >= num2) num1 -= num2;else num2 -= num1;}return count;}
};

找到最接近0的操作数

class Solution {
public:int m_abs(int num){if(num >= 0)    return num;else return -num;}int findClosestNumber(vector<int>& nums) {int result = nums[0];for(int num : nums){if(m_abs(num) < m_abs(result) || m_abs(num) == m_abs(result)&& num > result)    result = num;}return result;}
};

项目进度

因为我个人的基础问题,加上这个项目的学习阻力太大,基本上就是对着无脑的去码代码,实际上对我来说的学习和帮助是没有多少的,虽然前面投入了很多时间,但是综合考虑过来,决定了还是丢下这个MFC的项目,之后等自己的基础更好了或者有需要了再来完善这个项目。

当下的学习目标和重点还是可以放在基础的内容上面,把Linux系统编程的内容下面一部分看完

Day 13

字符串的替换数字

其实这个题目还是有点难度

  1. 数组的扩容
  2. 利用的是双指针的方式求解
#include <iostream>
using namespace std;void ReplaceNum(string &s)
{if (s.size() == 0)	return;int count = 0;//统计有多少个数字存在for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9')	count++;}int oldSize = s.size();s.resize(oldSize + count * 5);int newSize = s.size();//这里开始替换for (int i = oldSize - 1, j = newSize - 1; i < j; i--, j--){//分两种情况if (s[i] > '9' || s[i] < '0'){//说明这个属于字母的情况s[i] = s[j];}else//说明遇到的是数字的情况{//numbers[j] = 'r';s[j - 1] = 'e';s[j - 2] = 'b';s[j - 3] = 'm';s[j - 4] = 'u';s[j - 5] = 'm';i -= 5;}}
}
int main()
{string s;cin >> s; //在这里输入s的长度ReplaceNum(s);cout << s;return 0;
}

KMP算法

KMP算法是用来解决字符串匹配的问题,它可以更加高效的进行字符串的匹配

如何暴力求解字符串匹配,其实就是前缀表的匹配过程,然后利用next数组来保存前缀表的内容

class Solution {
public:void getnext(int* next, string target){if (target.size() == 0)	return;int j = 0;next[j] = 0;for (int i = 1; i < target.size(); i++){//当两者是不匹配的情况下,j必须要是大于0的情况下while (target[i] != target[j] && j > 0){//回退到前面的前缀和位置,然后在进行判断是否相同,这样子就不需要一个一个位置的回退j = next[j - 1];}if (target[i] == target[j])	j++;next[i] = j;}}int strStr(string haystack, string needle) {if (haystack.size() == 0 || needle.size() > haystack.size())	return -1;int next_arr[needle.size()];getnext(next_arr, needle);int j = 0;for (int i = 0; i < haystack.size(); i++){//用j来作为needle的下标while (j > 0 && haystack[i] != needle[j])	j = next_arr[j - 1];if (haystack[i] == needle[j])	j++;//判断j的下标是否在最末尾了if (j == needle.size()){return (i - needle.size() + 1);}}return -1;}
};

字符串判断

我觉得关于字符串的算法都比较难,对边界的处理啥的都不是特别的容易

在这里要注意这个string里面的find函数的返回值的结果

如果没有找到结果的话,返回的就是npos,这个表示的就是no position

class Solution {
public:bool repeatedSubstringPattern(string s) {string test = s + s;test.erase(test.begin());test.erase(test.end()-1);auto p = test.find(s);if (p != string::npos)   return true;return false;}
};

移除元素

暴力解决方式,当然也可以直接调用库函数来解决,知识熟悉一下库函数的使用

class Solution {
public:int removeElement(vector<int>& nums, int val){if (nums.size() == 0)    return 0;int size = nums.size();for (int i = 0; i < size; i++){//如果这里是i<nums.size是不可以通过的if (nums[i] == val){for (int j = i + 1; j < nums.size(); j++){nums[j - 1] = nums[j];}size--;i--;}}return size;}
};

双指针法

class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;int FastIndex = 0;while (FastIndex < nums.size()){//fast指向的是没有val的新数组if (nums[FastIndex] != val){nums[slowIndex++] = nums[FastIndex];}FastIndex++;}return slowIndex;}
};

设计模式

简单工厂设计模式

1.提供一个工厂类

简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

2.提供一个抽象产品类

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3.提供一个具体产品类

简单工厂模式所创建的具体实例对象


//1.提供一个工厂类
//简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
// 
//2.提供一个抽象产品类
//简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
// 
//3.提供一个具体产品类
//简单工厂模式所创建的具体实例对象//抽象产品类
class AbstractProduct
{
public:int left_value;int right_value;virtual int GetResult() = 0;
};//具体产品类
class AddFun :public AbstractProduct
{int GetResult(){return left_value + right_value;}
};class SubFun :public AbstractProduct
{int GetResult(){return left_value - right_value;}
};class ChuFaFun :public AbstractProduct
{int GetResult(){if(right_value != 0)	return left_value - right_value;else return -1;}
};class ChengFaFun :public AbstractProduct
{int GetResult(){return left_value * right_value;}
};//抽象工厂类
class AbstractFactory {
public:	static AbstractProduct* CreateOperation(char c){switch (c){case '+':return new AddFun;break;case '-':return new SubFun;break;case '*':return new ChengFaFun;break;case '/':return new ChuFaFun;break;default:break;}}
};int main()
{//创建一个抽象产品的指针指向工厂,来调用方法//因为Create是静态的,所以可以直接从类中调用AbstractProduct* pro = AbstractFactory::CreateOperation('+');pro->left_value = 10;pro->right_value = 20;cout << pro->GetResult() << endl;return 0;
}

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

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

相关文章

MATLAB实战 | 不同形式的三维曲面图

通常&#xff0c;MATLAB中绘制三维曲面图&#xff0c;先要生成网格数据&#xff0c;再调用mesh函数和surf函数绘制三维曲面。若曲面用含两个自变量的参数方程定义&#xff0c;则还可以调用fmesh函数和fsurf函数绘图。若曲面用隐函数定义&#xff0c;则可以调用fimplicit3函数绘…

【JUC】十三、CompletableFuture的常用方法

文章目录 1、获得结果和触发计算2、对计算结果进行处理3、对结算结果进行消费4、CompletableFuture的thenXX和thenXXAsync5、对计算速度进行选用6、对计算结果进行合并 1、获得结果和触发计算 获取任务结果 public T get()public T get(long timeout, TimeUnit unit)public T…

wpf 使用 StringFormat

在xaml里使用StringFormat,将两个字符串拼起来&#xff0c;一个字符串时固定不变的&#xff0c;一个字符串是动态绑定&#xff0c;如&#xff1a;平均密度&#xff1a;绑定的值 代码如下&#xff1a; <TextBlock Margin"0,0,0,0" Text"{Binding CellAverage…

STM32F103C8T6——4路PWM

//main()函数前面的extern TIM_HandleTypeDef htim2;extern TIM_HandleTypeDef htim3;//main()函数内部额外添加的HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim2…

SpringBoot注入Bean的几种方式

目录 统一测试类与config类 1. 启动类注入Bean 2.启动类扫描ComponentScan 3.启动类EnableConfigurationProperties 4.启动类Import 统一测试类与config类 yml student:red: dou config Configuration注解 与 Component注解都可以。 Data Configuration Configuratio…

v-clock

v-clock 给元素上加了这个属性&#xff0c;初始值为display&#xff1a;none&#xff0c;登vue的文件编译结束后再删除这个元素&#xff0c;回显编译后的元素和数据 <body><div id"app"></div><template id"my-app"><h2 v-cl…

013 C++ set与map的用法

前言 本文将会向你介绍set与map的主要用法 set详解 int main() {set<string> s;vector<string> v { "Fan1","Fan2", "Fan3", "Fan4" };for (auto e : v){s.insert(e);}string input;while (cin >> input){if (s.…

重装linux后需要做的配置

1. linux中 vim如果输入中文乱码 打开/etc/vim/vimrc输入&#xff1a; set fileencodingsutf-8,gbk set termencodingutf-8 set encodingutf-8 把vim的缩进格式顺便改了 http://t.csdnimg.cn/K3ncc 2. 配置sudo授权用户 3. 新导入项目后 , chmod -R x 添加权限 4. 查询主机i…

数组题目:118. 杨辉三角 、 119. 杨辉三角 II 、661. 图片平滑器 、598. 范围求和 II 、 419. 甲板上的战舰

118. 杨辉三角 思路&#xff1a; 找规律&#xff0c;每一行的第一个元素和最后一个元素都是1&#xff0c;其中中间需要改变的数找对应的规律 比如第二行&#xff08;从0开始&#xff09;的2&#xff0c;是dp[1][0] dp[1][1]。类似的找出对应的规律 代码&#xff1a; clas…

题目标题 abc+cba=1333 c语言

题目描述&#xff1a; 已知abccba1333&#xff0c;其中a,b,c均为一位数&#xff0c;编程求出所有满足条件的a,b,c所有组合。 &#xff08;知识点&#xff1a;控制语句&#xff09; 输入描述&#xff1a; 无 输出描述&#xff1a; 输出数据为多组&#xff0c;每组三个整形数…

【网络安全】-常见的网站攻击方式详解

文章目录 介绍1. SQL 注入攻击攻击原理攻击目的防范措施 2. 跨站脚本攻击&#xff08;XSS&#xff09;攻击原理攻击目的防范措施 3. CSRF 攻击攻击原理攻击目的防范措施 4. 文件上传漏洞攻击原理攻击目的防范措施 5. 点击劫持攻击原理攻击目的防范措施 结论 介绍 在数字时代&a…

【实践】Deployer 发布到search head : local OR default

1: 背景: search head deployer 上的 /opt/splunk/etc/schcluster/apps 下面的local, 还有default 派发到 search head 到app 下面是怎么工作的,这个过程,实践了一下: 参考Use the deployer to distribute apps and configuration updates - Splunk Documentation 2: 实…

aspera传输方案怎么样,需要选择aspera替代方案吗

Aspera传输方案是一种高速、可靠的文件传输解决方案&#xff0c;适用于需要大规模传输大文件或数据集的企业和组织。Aspera采用UDP协议及自己开发的FASP协议进行加速传输&#xff0c;能够在高延迟、高丢包网络环境下实现稳定快速的传输。 Aspera传输方案具有以下优点&#xff1…

Selenium Grid

Selenium Grid 什么是Selenium Grid Selenium是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上 Selenium Grid的两个版本 Grid1与Grid2两个版本的原理和基本工作方式完全相同&#xff0c;Grid2同时支持Selenium1和Selenium2&#x…

<JavaEE> Thread线程类 和 Thread的常用方法

目录 一、Thread概述 二、构造方法 三、常用方法 1.1 getId()、getName()、getState()、getPririty() 1.2 start() 1.3 isDaemon()、setDaemon() 1.4 isAlive() 1.5 currentThread() 1.6 Interrupt()、interrupted()、isInterrupted() 1.6.1 方法一&#xff1a;添加共…

stream流和方法引用

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…

SIT65HVD75,可替代SN65HVD75,3.0~5.5V 供电,ESD 15kV HBM,20Mbps 半双工 RS485/RS422 收发器

SIT65HVD75 是一款 3.0V~5.5V 电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、 总线耐压范围达到 15V 、半双工、低功耗&#xff0c;功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发 器。 SIT65HVD75 包括一个驱动器和一个接收器&#xff0c;两者均可…

模板上新|2023年10月DataEase模板市场上新动态

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…

计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)

目录 介绍 三个重要问题 封装成帧 差错检测 可靠传输 使用广播信道的数据链路层 其他问题 介绍 本篇对数据链路层进行概述&#xff0c;我们首先来看看数据链路层在网络体系结构中的地位&#xff1a; 主机H1给主机H2发送数据&#xff0c;中间要经过三个路由器和电话网、…

【Lidar】基于Python的点云数据下采样+体素显示

1 Open3D库介绍 Open3D是一个开源的3D数据处理库&#xff0c;发布于2015年&#xff0c;目前已经更新到0.17.0版本。它基于MIT协议开源许可&#xff0c;使用C11实现&#xff0c;并经过高度优化&#xff0c;还通过Python Pybinding提供了前端Python API。 Open3D为开发者提供了一…