自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 多线程场景下设置代码段属于某特定线程

使用场景:一个线程完成一个任务需要循环访问某函数3次,且在这3次之间不允许其他线程执行该函数解释: 某函数会被多个线程调用,但是获取到函数使用权的线程会多次调用该函数且在多次调用期间不允许其他线程执行该函数代码实现:std::mutex mAcquireBufferMutex;std::mutex mApplicantsMutex;std::condition_variable mAcquireBufferCond;static std::string caller("");vo.

2021-03-31 17:02:22 166

原创 HAL层结构 & HAL向上层提供接口

1. 基础了解: https://www.cnblogs.com/microliang/p/3424311.html2.1 使用代码实现一个简单hal: https://blog.csdn.net/Luoshengyang/article/details/65672572.2 hal怎么向上层提供接口: https://blog...

2020-04-24 21:07:52 593

原创 好用的工具搜集

英语翻译软件:https://www.chainnews.com/articles/494815367315.htm https://quest-app.appspot.com/home

2020-04-20 17:10:34 250

原创 红黑树的插入

在介绍红黑树之前我们先介绍一下BST树和AVL树: BST树又叫做二叉搜索树;该树的特点是:树中的数值不能重复;任意结点的左孩子的值比该结点的值小;任意结点的右孩子的值比该结点的值大。这样的树就叫做BST树,图示如下:这就是一颗BST树,此结构拥有二叉树结构的优点,理论上能到达logn的插入和删除效率,但是很不幸,此结构在存储单调变化的数据是会退化为链表;当我们插入单递增...

2019-07-20 22:44:04 213

原创 红黑树删除的详细介绍

要搞清楚红黑树的删除,一定要结合红黑树的5个性质: 1. 每个节点或是红的或是黑的 2. 根节点为黑色 3. 外部节点是黑色的 4. 如果一个结点是红色的,那么它的两个儿子都是黑色的 (红红不能相连) 5. 对每个结点的,从该节点出发到外部结点的所有路径上包含相同个数的黑色结点(黑高相同)红黑树的删除策略: ...

2019-07-19 23:39:56 1330 4

原创 Linux中C代码的编译链接原理

本文将介绍linux系统中C代码的编译链接原理,如果你对.c源文件是怎么变成一个可执行程序并最终执行的过程很感兴趣但是还不是很了解,那么本文就为你系统的讲解这个过程。 将一个.c文件变成可执行文件的过程是很复杂的,为了使问题简单,前人将整个过程细分为五大步骤,分别为:预编译,编译,汇编,链接,运行。这五步层层递进,最终结果就是将一个.c文件变成一个运行在内存中的进程。...

2019-07-17 22:54:07 565

原创 printf("%d %d\n", ++i,++i) 输出的值

原因: https://blog.csdn.net/xv1356027897/article/details/81608267汇编指令了解: https://www.cnblogs.com/lxgeek/archive/2011/01/01/1923738.htmlvoid func(int a, int b){}int main(){ ...

2019-07-17 20:45:04 5518

原创 一级指针and二级指针------树的创建and单链表的创建

在最近的一段时间内,对一级指针和二级指针有一个疑惑,什么时候用二级指针,什么时候用一级指针?尤其是在二叉树的创建和不带头的单链表的头插时,前者参数列表使用的是一级指针,后者参数列表使用的是二级指针,伪代码如下:二叉树的创建:typedef struct BtNode{ int val; struct BtNode *left; struct BtNode *right...

2019-06-09 17:29:41 362

原创 数值的整数次方 & 3种错误处理的方法

问题描述: 实现Power(double base,int exponent),求base的exponent次方,不考虑大数问题。分析: 指数小于0时,得到正数部分,最后结果要取倒数;而指数为0且底数为0时就错误,因为0不能取倒数代码实现:bool g_InvalidInput = false;bool is_0(double base){...

2019-05-25 08:40:32 162

原创 表示数字的字符串

问题说明: 实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如:“+100”,“5e2”,“-123”,“-1e-16”,“2.345E9”都可表示数字,"12e","1a3.14","1.2.3","12e+5.4" 都不能表示数字。分析: 可将表示数字的字符串抽象为:A [[.B]] [E|eC] 或者 .[B][E|eC]其...

2019-05-24 22:59:13 3472

原创 正则表达式匹配

问题说明: 实现一个函数用来匹配包含'.' 和 '*' 的正则表达式; 在模式中,'.'表示任意字符, '*'表示其前面的字符可以当做任意次(包括0次,1次,n多次) ; 例如字符串"aaa"和模式"a.a" / "ab*ac*a"匹配,和模式"a.aa" / "ab*a"不匹配。分析:(1) 当模式中的第二个(相对的第二) 字符不是'*',则开始匹配剩余的字符,如...

2019-05-24 18:59:46 353

原创 结构体的大小 -- 内存对齐

#include<iostream>using namespace std;struct t1 //结果为8的倍数,因为最大成员类型double占8字节{ char a; //1 char b; //1 short c; //2 ,增加4个字节的空白 double d; //8}; //16struct t2 //结果为2的倍数,因为最大成员类型short占2字...

2019-05-24 15:10:32 150

原创 二叉树中任意两节点的最近父祖先

分析:1.二叉树是 二叉搜索树(左节点小于父节点,右节点大于父节点) 思路:从根节点开始,如果当前节点比两个节点都大,则在左子树;如比当前节点都小,则在右子树 以此类推,直到找到一个节点的大小介于两节点之间,则该节点就是最近的公共父节点2.非二叉搜索树,但有指向父节点的指针域 思路:分别从两个节点开始得到其...

2019-05-24 13:49:49 407

原创 字符串转数组---atoi

字符串转数字: 注意:1.越界 2.正负 3.字符串为NULL:str == NULL 4.字符串为空串: str == "" 5.字符串为0: str == "0" 6.字符串只有符号位: str == "+" 或者 str == "-...

2019-05-24 13:47:07 657

原创 树的子结构

问题说明: 输入两颗二叉树A和B,判断 B是不是 A的子结构,即 A中的一部分子树和 B是一样的:分析: 1. 先找到A 中和 B的跟节点相等的点 2. 如果找到了再判断是不是错误的想法: 用层次遍历的结果进行匹配,错误原因如下图:结合分析的代码实现:bool DoesTree1HaveTre...

2019-05-23 23:17:14 133

原创 反转链表 & 找链表的入环点 & 找链表的倒数第k个节点 & 使得数组中奇数位于偶数之前

反转链表: 1. 用头插来实现 2. 用栈来实现(递归) 3. 三个指针,一个表示本节点,一个表示前驱,一个表示后继找链表的入环点: 第一步确认是否有环: 方法:快慢指针: 一个走得快,一个走的慢,当慢的能追上快的就是有环 ...

2019-05-23 23:05:55 190

原创 O(1)删除链表节点 & 删除链表中的重复节点

O(1)删除链表节点:代码实现:void DeleteNode(ListNode **plist, ListNode *pToBeDelete){ if (plist == NULL || pToBeDelete == NULL) return; if (pToBeDelete->next != NULL) //要删除的点不是尾节点 { ListNode *pNe...

2019-05-23 19:10:55 207

原创 打印从1到最大的n为数

问题举例: 当n为3时,则打印 1~999。代码实现:void PrintToMaxOfNDigits_1(int n){ int number = 1; int i = 0; while (i++ < n) //假如n = 3,则number = 1000 number *= 10; for (int i = 1; i < number; i...

2019-05-23 12:52:05 215

原创 字符串匹配问题---KMP & BF

BF算法实现:复杂度O(m*n)//在str的pos下标开始,判断是否包含sub字符串,包含则返回第一次匹配成功的开始下标int BF(const char *str, const char *sub, int pos) { if (str == NULL || sub == NULL) return -1; int lenstr = strlen(str); if (p...

2019-05-22 20:50:01 240

原创 回溯法

回溯法: 回溯法可以视作蛮力法的升级版,他可以从解决问题的每一步的所有可能选项里系统的选择一个可行方案。所以回溯法适用于有多个步骤组成的问题。题目一: 矩阵中的路径:判断一个矩阵中是否包含一条某字符串中所有字符的路径。路径可以从矩阵的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了某一格,则不能再进入该格子。分析: ...

2019-05-22 08:55:37 150

原创 动态规划

适用于动态规划解决的问题所具有的特点:1、求得一个问题的最优解2、整体问题的最优解依赖于子问题的最优解3、把大问题划分为若干小问题,这些小问题还有相互重叠的更小的子问题4、问题可以自上而下分析,要从下而上求解。题目一: 一段长为n的绳子,把绳子剪为m段(m,n都是整数,n>1 并且 m>1),每段绳子的长度记为 K0,K1,...,Km。...

2019-05-21 22:57:03 143

原创 旋转数组的最小数字

题目: 把一个数组最开始的若干个数字搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:{3,4,5,1,2} 为数组 {1,2,3,4,5}的一个旋转,该数组的最小值为 1.分析; 1. 可以从头遍历一遍,但是没有使用到递增数组这个条件,不是最优复杂度的解 2. 可以仿照二分查找的思想,使得复杂...

2019-05-21 18:34:02 144

原创 快排--快排一次划分的应用 & O(n)复杂度的排序

快排:快排一次划分的应用: 1. 长度为n的数组的中查找第 k大的数字 2.长度为n的数组的中查找前 k大的数字,等等O(n)复杂度的排序:例题: 某公司几万名的员工,现对员工的年龄进行排序,复杂度要求为O(n),提示,可以使用 常量级别的辅助空间。分析: 由于是年龄的排序,那么可以申请一个数组,...

2019-05-21 17:38:02 608

原创 递归--斐波那契/青蛙跳台阶/矩阵填充

斐波那契: 递归实现:long long Fibonacci(unsigned int n){ if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2);} 循环实现:long long Fibonacci(unsigned ...

2019-05-21 17:11:32 262

原创 位运算&进制转换

进制转换:(1) 十进制与二进制之间的转换 十进制转换为二进制,分为整数部分和小数部分 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例:例:将十进制的168转换为二进制得出结...

2019-05-21 13:03:58 2319

原创 两个栈实现一个队列&两个队实现一个栈

题目一: 用两个栈来实现一个队列,完成队列的push和pop操作。 队列中的元素为int类型。分析: 入栈都进入stack1, 出栈都是在stack2;当stack2无数据的时候将 stack1全部数据放入stack2中代码实现:class Queue{public: void push(int node) { stack1...

2019-05-20 23:09:14 419

原创 二叉树的递归和非递归遍历

节点定义如下:typedef struct TreeNode { int val; TreeNode *left; TreeNode *right;}TreeNode;先序递归遍历:void PreOrder(TreeNode *p){ if (p != NULL) { cout << p->val << " ";...

2019-05-20 21:37:45 151

原创 中序遍历和先序遍历组合重建二叉树

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析: 使用递归来实现这个问题代码实现:typedef struct TreeNode { int va...

2019-05-20 21:15:44 181

原创 字符串替换空格

问题描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。分析: 1. 从前向后替换,需要挪动数据,复杂度为O(n^2) 2. 从后向前替换,可不必挪动数据,复杂度为O(n)代码实现://length为数组最大的容量 void repla...

2019-05-20 19:55:08 138

原创 数组中重复的数字

题目一: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出的重复的数字为2或3。分析: 1. 用排序,但是最快的排序也要nlog(n),可不可以 O(1) ...

2019-05-20 17:49:26 143

原创 找出中序遍历顺序的下一个结点

问题描述: 给定一颗二叉树和其中一个节点,找出中序遍历序列的下一个节点!树中的每个节点有 左/右/父 三个指针域。提示:不是所有的节点都有其下一个节点,所以结果可能为 NULL 根节点的父节点为 NULL节点的定义如下:struct TreeLinkNode { int val; struct TreeLinkNode *left; st...

2019-05-20 13:47:07 941

原创 const修饰指针

(1) 指向非const数据的非const指针 书写形式为: int *countPtr ; 特点: 指针的指向可以被修改,指向的数据可以被修改#include<iostream>int main(){ int x = 10; int y = 20; std::cout << "x:" << x &...

2019-03-20 13:35:03 525

原创 守护进程

守护进程的概念: 长时间在后台执行,不与用户交互,但是能提供某种服务的进程。一般守护进程的命名以 "d"来结尾,说明这是个守护进程,例如 : httpd要实现守护进程,首先需要了解下面4个概念: 1. 会话: 可以认为在Linux中每打开一个终端就与系统建立一个会话 2. 会话首进程: 在会话建立的第一个进程,一般来说是终端中的...

2019-03-16 00:11:40 3982 1

原创 智能指针原理理解 和 ->运算符的重载

一个内存泄漏的实例:#include&lt;iostream&gt;void Func(int *p){ int *ptmp = new int; if (p == NULL) { throw std::exception("p is null!"); } *ptmp = *p; delete ptmp;}int main(){ while (true) {...

2019-03-14 23:32:47 420

原创 内存池(创建以后基本不释放,要释放需要自己实现这个功能)

//单例模式的#include&lt;iostream&gt;#include&lt;string&gt;const int MEM_SIZE = 10;template&lt;typename T&gt;class MEM_Management //单例模式{public: static MEM_Management&lt;T&gt;* getInstance() {...

2019-03-14 18:27:23 638

原创 容器适配器-实现vector

#include&lt;iostream&gt;#include&lt;stack&gt;using namespace std;template&lt;typename _Ty&gt;class Vector{public: typedef _Ty value_type;public: Vector() { parr = new _Ty[2](); cursize...

2019-03-14 18:23:54 306

原创 模板

第一类:函数模板 1.函数模板:函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。 2.模板函数:在使用函数模板时,要将这个形参实例化为确定的数据类型。将类型形参实例化的参数称为模板实参; 用模板实参实例化的函数称为模板函数。模板函数的生成就是将函数模板的类型形参实例化的过程。...

2019-03-13 23:13:32 144

原创 函数指针

#include&lt;iostream&gt;typedef int(*PFunc)(int,int); //PFunc 表示的是 int(*)(int,int) 类型的函数指针int Sum(int a,int b) { return a + b;}int Sub(int a, int b){ return a - b;}int ToCalc(int a, ...

2019-03-13 17:04:56 86

原创 单例模式

知识补充:一.static 成员变量 1. 一定要在类外初始化 2. 静态成员变量属于类作用域 3. 不依赖对象static 成员方法 1. _cdecl调用约定 没有this指针 2. 不依赖对象调用 3. 能看见类中所有的成员* ->* 这两个操作符号是...

2019-03-13 16:36:20 107

原创 malloc 和 new 的区别

一.区别: 1.new 在 自由存储区域 开辟空间 malloc 堆上 2.new 返回类型安全 malloc 返回类型不安全(返回void *) 3.new 开辟时不需要计算内存开辟的大小 malloc 开辟时需要计算内存开辟的大小 4.new 失败抛出异常 (bad_alloc)...

2019-03-13 15:36:06 110

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除