- 博客(71)
- 收藏
- 关注
原创 GDB常用知识点
0. GDB常用命令1. core_dump2. gdb调试core_dump文件3. gdb调试正在运行的程序4. gdb调试多进程程序5. gdb调试多线程程序6. gdb监视变量
2022-12-24 18:11:52 1949 1
原创 设计模式-适配器模式
将⼀个类的接⼝转换成客户希望的另⼀个接⼝。Adapter模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。——《设计模式》GoF。
2022-10-26 16:24:06 345
原创 设计模式-责任链模式
使多个对象都有机会处理请求,从⽽避免请求的发送者和接收者之间的耦合关系。将这些对象连成⼀条链,并沿着这条链传递请求,直到有⼀个对象处理它为⽌。——《设计模式》GoF。
2022-10-24 13:51:40 131
原创 网络中数据传输的过程
数据传输的背景(1) 现在互联网中使用的是基于OSI七层模型的TCP/IP模型。TCP/IP模型包括五层,即物理层,数据链路层,网络层,传输层,应用层;其中数据链路层又可以分为两个子层,即LLC(逻辑链路控制层)和MAC(介质访问控制层)。这些层的分工合作是数据正确传输的基础。(2) ARP协议(地址解析协议),它的主要功能是将网络层IP地址转化为数据链路层MAC地址。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。在以太网中或者在同一局域网中,所有对IP地址的访问都转换为对数据链路层网卡M
2022-06-14 00:08:20 1125
原创 LeetCode-337. 打家劫舍 III
LeetCode-337. 打家劫舍 III难度:中等小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。代码:class Solution {public: vector&l
2022-04-07 16:05:31 247
原创 LeetCode-213. 打家劫舍 II
LeetCode-213. 打家劫舍 II难度:中等你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2
2022-04-07 15:49:32 201
原创 LeetCode-198. 打家劫舍
LeetCode-198. 打家劫舍难度:中等你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 +
2022-04-07 15:20:04 189
原创 LeetCode-494. 目标和
494. 目标和难度:中等给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例 1:输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5
2022-04-06 23:43:30 715
原创 LeetCode-343. 整数拆分
LeetCode-343. 整数拆分难度:中等给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。示例 :输入: n = 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。class Solution {public: int integerBreak(int n) { vector<int> f(n+1);//f[i] 拆分数字i,使得f[i]为i拆分
2022-04-06 19:08:08 1546
原创 LeetCode-62. 不同路径
LeetCode-62. 不同路径难度:中等一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?class Solution {public: //递归超时 时间复杂度2^(m+n-1) // int dfs(int i, int j, int m, int n) { // if(i>=m ||
2022-04-06 18:19:01 148
原创 LeetCode-72. 编辑距离
LeetCode-72. 编辑距离难度:困难给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)cl
2022-04-06 00:25:42 357
原创 LeetCode-1143. 最长公共子序列
LeetCode-1143. 最长公共子序列难度:中等给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:
2022-04-05 21:43:14 241
原创 LeetCode-516. 最长回文子序列
LeetCode-516. 最长回文子序列给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。class Solution {public: int longestPalindromeSubseq(string s) { int n = s.size();
2022-04-05 17:26:20 525
原创 LeetCode-132. 分割回文串 II
LeetCode-132. 分割回文串 II难度:困难给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。示例 :输入:s = “aab”输出:1解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。class Solution {public: int minCut(string s) { if(s.size() == 0)return 0; //记录字符串下标i-j是否是回文
2022-04-04 22:59:17 527
原创 C++多态、虚函数、虚函数表、编译期、运行期、静态、动态的理解
关于C++多态1. 多态分为静态多态和动态多态1.1 静态多态1.1.1函数重载1.1.2模板1.1.3静态多态总结1.2 动态多态:在运行时期才能决定函数行为1.2.1先讲一些储备知识,不然初学者听着迷糊1.2.2 多态的体现:1.2.3 动态的体现1. 多态分为静态多态和动态多态1.1 静态多态静态多态是编译期决定的:在编译期间就决定了行为,也就是在运行到静态多态的时候函数的执行流程都一样包括两种:函数重载和模板1.1.1函数重载函数重载:函数名相同且参数列表不同称为函数重载静态多态体现
2022-03-18 10:53:32 1722
原创 C++程序编译过程
C++程序编译过程1.编译流程图2.预处理3.编译4.汇编5.链接1.编译流程图2.预处理编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
2022-02-19 15:42:08 4269
原创 计算机网络面试高频考点
计算机网络面试高频考点1.TCP三次握手过程①首先握手过程是建立在被动方处于监听状态。②客户端发送syn报文并随机一个序列号发送给服务器,此时客户端为syn_send状态,③服务器收到syn报文后,发送给客户端一个syn+ack报文,并随机一个序列号,确认序号为syn序号+1,发送后服务器会将这个连接添加到半连接队列,并处于syn_recv状态④客户端收到服务器发来的syn+ack报文后,返回一个ack确认报文,序列号为syn的确认序列号,确认号为syn序列号+1,客户端处于establishe
2022-02-15 20:01:59 1309
原创 C++智能指针
智能指针一、Auto_ptr二、Unique_ptr三、Share_ptr四、Weak_ptr智能指针的提出是为了解决内存泄露问题的,实现方法是利用了类在生命周期结束会自动调用析构函数,在智能指针使用的时候智能指针本身不是一个指针,他只所以能用->访问出new的类型是它内部重载了->并返回了一个type*。一、Auto_ptr是最先出的智能指针,他再后来被弃用了有一个很重要的原因:他能够通过赋值语义将内存直接交给其他智能指针,这个特性很容易导致程序崩溃,并且这个特性不符合STL的复制构造函
2022-01-29 20:00:59 675
原创 HTTPS的安全性是如何保证的
1. **非对称加密的方式实现信息的机密性,解决了窃听的风险**。但实际HTTPS中非对称加密只是在连接建立初期用来生成对称加密秘钥的,生成之后双方用此秘钥进行对称加密传输消息,毕竟非对称加密开销太大。2. **摘要算法的方式来实现完整性**,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,**解决了篡改的风险**。3. **将服务器公钥放入到数字证书中,解决了冒充的风险**。
2022-01-24 13:07:59 4206
原创 UDP的广播与组播代码实现+解析
UDP的广播与组播代码实现+解析一、UDP广播1.2.代码实现服务器客户端二、UDP组播1.2.代码实现服务器客户端一、UDP广播1.2.代码实现服务器#include<stdio.h> 2 #include<unistd.h> 3 #include<stdlib.h> 4 #include<sys/socket.h> 5 #include<string.h> 6 #include<arpa/inet.h>
2022-01-21 21:04:01 3616
原创 C++普通继承、多继承、虚继承内存空间排布分析
C++普通继承、多继承、虚继承内存空间排布分析一、普通继承二、多继承三、菱形继承四、虚继承1.部分虚继承2.完全虚继承总结一、普通继承代码class A{public: virtual void virtualfunA(){ } virtual void virtualfunAA(){ } void funA(){ }public: int a;};class B : public A{public: virtual void virtualfunA(){ }
2022-01-19 15:32:07 3399
原创 HTTP到HTTPS的发展及优化
HTTP到HTTPS的发展及优化一、HTTP/0.9二、HTTP/1.0三、HTTP/1.1四、HTTP/2五、HTTP/3六、未来可能的发展一、HTTP/0.9只有get请求;服务器返回的格式只能是html格式;服务器响应数据之后自动关闭连接;总结:http/0.9只是一个草案,纯文本格式。这时候还不支持传输图片、文件等超文本,并且是短连接。二、HTTP/1.0图像、视频等文本信息都能传输 ;新增了post、put等请求;新增了http header,状态码,缓存等基本功能;依旧
2022-01-18 12:54:01 335
原创 Redis-RDB、AOF持久化
Redis-RDB、ADOF持久化前言一、RDB持久化0.简单介绍1.RDB备份流程2.触发模式3.优点4.缺点二、AOF持久化0.简单介绍1.AOF备份流程2.文件同步触发策略3.重写触发(aof rewrite)4.优点5.缺点四、混合持久化1.流程图2.配置方式五、应用场景前言我们知道,Redis的数据是存储在内存中,断电即失,所以Redis大多用作缓存型数据库。但是Redis也是提供了RED持久化和AOF持久化两种方式,来把内存中的数据落盘到磁盘中。下面来主要介绍一下这两种方式。一、RDB持
2022-01-14 21:17:37 595
原创 Redis-事务
Redis-事务1.事务的定义2.Redis事务的特性3.事务的错误处理3.1简单说明3.2入队时产生的错误3.3执行时产生的错误4.Redis为什么不支持回滚操作5.事务相关的一些命令6.WATCH原理7.WATCH(监视)用法1.事务的定义百度百科:数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。作者理解:事务是将多条命令放到一起执行,要么都执
2022-01-13 21:13:00 507
原创 LeetCode-701. 二叉搜索树中的插入操作
LeetCode-701. 二叉搜索树中的插入操作难度:中等给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。class Solution {public: TreeNode* insertIntoBST(TreeNode* root, int val) {
2022-01-12 10:58:05 166
原创 设计模式-中介者模式
设计模式-中介者模式应用场景问题:在面向对象系统的设计和开发过程中,对象与对象之间存在着相互依赖的关系。在对象很多的情况下,这种关系会越来越复杂,回事系统的耦合性加剧,代码不易于维护。解决:中介者模式可以解决这种窘境。它是通过引入中介者类,将所有的对象组合到中介者中,当有对象需要和其他对象交互时,先通知中介者,再由中介者转发交互信息。类图代码代码关系图中介者class Country;//联合国class UnitedNations{public: virtua
2022-01-11 12:12:38 287
原创 LeetCode-236. 二叉树的最近公共祖先
LeetCode-236. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”class Solution {public: TreeNode* fun(TreeNode* root,TreeNode* p,TreeNode* q){ if(p == r
2022-01-10 21:21:36 133
原创 LeetCode-501. 二叉搜索树中的众数
LeetCode-501. 二叉搜索树中的众数给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。class Solution {public: //中序遍历 TreeNode* pre = nullptr; int count=1; int maxCount; vector<int> result; void fun(TreeNode* root){ if(!root)return;
2022-01-09 21:05:20 243
原创 LeetCode-530. 二叉搜索树的最小绝对差
LeetCode-530. 二叉搜索树的最小绝对差难度:简单给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。class Solution {public: TreeNode* pre = nullptr; int minnum=INT_MAX; int getMinimumDifference(TreeNode* root) { if(!root)return 0;
2022-01-09 20:45:57 438
原创 LeetCode-98. 验证二叉搜索树
LeetCode-98. 验证二叉搜索树给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。class Solution {public: // bool fun(TreeNode *root,long lower ,long uper) // { // if(!root)return true;
2022-01-09 20:31:12 488
原创 LeetCode-700. 二叉搜索树中的搜索
LeetCode-700. 二叉搜索树中的搜索难度:简单给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。class Solution {public: TreeNode* searchBST(TreeNode* root, int val) { if(!root)return NULL; if(root->val > val){
2022-01-09 20:11:38 437
原创 Linux-进程间通信
Linux-进程间通信1. 管道1.1 匿名管道1.2 命名管道2. 信号3. 共享内存4. 消息队列5. 信号量6. socket7. 效率对比不同的进程有着不同的虚拟地址,所以要想实现进程间通信,都是需要通过内核做中间介质来实现的。1. 管道匿名管道是一种半双工的通信方式,具有固定的读端和写端。当管道写满时写数据会阻塞,当管道为空时读数据会阻塞,当只有读端或写端时读或写也会阻塞。读出的数据会在管道消除。1.1 匿名管道特点:由于匿名管道通信是通过内核空间完成的,所以不会创建真是文件,这就导致
2022-01-09 15:47:49 1108 5
转载 排序算法时间复杂度、空间复杂度、稳定性比较
排序算法时间复杂度、空间复杂度、稳定性比较转载文章:https://blog.csdn.net/yushiyi6453/article/details/76407640
2022-01-08 12:18:52 116
原创 LeetCode-113. 路径总和 II
LeetCode-113. 路径总和 II难度:中等给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。class Solution {public: void fun(TreeNode* root,vector<int> v ,vector<vector<int>>& res,int targetSum){ if(!r
2022-01-07 13:52:14 518
原创 LeetCode-112. 路径总和
LeetCode-112. 路径总和难度:简单给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/path-sum著作权归领扣网络所有。商业转载请联系官方
2022-01-07 13:36:18 212
原创 LeetCode-513. 找树左下角的值
LeetCode-513. 找树左下角的值难度:中等给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。class Solution {public: /* 1.递归方法 //最底层-->最大深度-->用一个整形记录深度 //最左边-->前序遍历-->-->用一个整形记录结果 int max_depth=-1; int res; //要递归整棵树才
2022-01-07 13:00:26 500
原创 LeetCode-257. 二叉树的所有路径
LeetCode-257. 二叉树的所有路径难度:简单给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。class Solution {public: //前序遍历+回溯即可 void traversal(TreeNode* root , string path , vector<string>& res){ path += to_string(root->val);
2022-01-07 11:30:30 792
原创 LeetCode-110. 平衡二叉树
LeetCode-110. 平衡二叉树难度:简单110. 平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。class Solution {public: /* 比较每个节点左右的高度差,所以需要从下往上遍历(后序遍历) */ int getDepth(TreeNode* root){ if(!root)return 0;
2022-01-06 11:37:07 299
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人