自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis使用setnx实现分布式锁及其问题、优化

最近在工作中用到了分布式锁,然后查了很多分布式锁的实现方式。比较熟悉redis或者说,redis的用法比较简单,所以查了一下redis使用setnx实现分布式锁的方式。其中有一篇文章搜索到的次数最多,多到我不知道哪个是原创文章,就贴一下看到的链接吧https://blog.csdn.net/lihao21/article/details/49104695。reids > setnx(key,value) //设置key.redis > delete(key) //将key删除当ke

2020-11-30 00:14:54 3449 1

原创 LeetCode:236. Lowest Common Ancestor of a Binary Tree( 二叉树的最近公共祖先)

class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root==NULL){ return root; } //找到p或者q就返回。 if(root...

2019-05-18 22:32:58 259

原创 LeetCode:10.正则表达式匹配;44. 通配符匹配;

10.正则表达式的匹配注释程序去解答题目,递归class Solution {public: bool isMatch(string s, string p) { return matchCore((char*)s.c_str(),(char*)p.c_str()); } bool matchCore(char *str,char * pat){...

2019-05-18 16:12:32 363

原创 LeetCode:75.颜色分类;41. 缺失的第一个正数;通过交换位置来解决。

75. 颜色分类给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]进阶:一个直观的解决方案是使用计数排序的两趟扫描算...

2019-05-18 13:51:30 228

原创 LeetCode:45.跳跃游戏;55. 跳跃游戏

45.跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。class Solution {pu...

2019-05-16 16:48:18 200

原创 LeetCode:56. Merge Intervals(合并区间);57.Insert Interval(插入区间)

给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。输入: intervals = [[1,3],[6,9]], newInterval = [2,5]输出: [[1,5],[6,9]]输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], ne...

2019-05-14 22:21:01 240

原创 字符串问题总结

1、最长公共子序列问题(LCS问题)给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度。例如:A = “HelloWorld”B = “loop”则A与B的最长公共子序列为"loo",返回长度为3。动态规划解法:定义子问题:dp[i][j]为字符串A的第一个字符到第i个字符串和字符串B的的第一个字符到第j个字符的最长公共子序列,如A为“app”,B为“...

2019-05-14 21:07:09 276

原创 排序算法总结

#include#include#include#include#includeusing namespace std;/*1、堆排序*///调整大顶堆,从非叶节点节点开始从上到下,即从父节点到子节点void adjustHeap(vector &nums, int i, int length) {int temp = nums[i];//先取出当前元素ifor (...

2019-05-06 00:10:17 245 1

原创 LeetCode

1、两数之和:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]方法一...

2019-04-29 23:55:41 172

原创 数据库---概念介绍及理解

1、概念1)、主键数据库表中对储存数据对象予以唯一和完整标识的数据列或属性组合,一个数据列只能有一个主键,且主键的值不能缺失,即不能为空值(NULL).2)、超键在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个抄件,多个属性也可以作为一个超键。超键包含候选键和主键。3)、候选键是最小的超键,即没有冗余的超键。4)、外键在一个表中存在的另一个表的主键称此表的外键...

2019-04-28 14:49:24 576 1

原创 网络I/O模型

1、阻塞I/O1)当上层应用app调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层应用app将阻塞(默认行为,被linux内核阻塞)。2)当对等方发送了数据,linux内核recv端缓冲区,有数据后,内核会吧数据copy给用户空间。然后上层应用解除阻塞,执行下一步操作。2、非阻塞I/O1)、上层应用程序将套接字设置成非阻塞模式2)、上层应用程序轮询调用recv函数...

2019-04-24 23:58:14 180

原创 Socket编程---长短连接

长连接和短连接是由客户端决定的短连接是客户端每做一个通信就连接一次如果是频繁的业务模型,长连接比较好写一个短连接的的例子:#include<unistd.h>#include<sys/stat.h>#include<sys/wait.h>#include<sys/types.h>#include<fcntl.h>#in...

2019-04-22 23:06:13 520

原创 Socket编程---p2p模型

自己既能发送数据也能接收数据,既是服务端也是客户端服务端代码:#include<unistd.h>#include<sys/stat.h>#include<sys/wait.h>#include<sys/types.h>#include<fcntl.h>#include<stdlib.h>#include&...

2019-04-22 22:53:02 374

原创 Socket编程---c/s模型demo2

demo2的客户端和demo1的客户端相同只需要写重写服务端的程序.服务端代码如下:#include<unistd.h>#include<sys/stat.h>#include<sys/wait.h>#include<sys/types.h>#include<fcntl.h>#include<stdlib.h>...

2019-04-22 22:15:29 181

原创 Socket编程---c/s模式演示demo1

首先,看服务端代码:#include<unistd.h>#include<sys/stat.h>#include<sys/wait.h>#include<sys/types.h>#include<fcntl.h>#include<stdlib.h>#include<stdio.h>#include&...

2019-04-22 21:52:21 363

原创 Socket编程---API

Socket可以看成是用户进程与内核网络协议栈的编程接口Socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机间的通信。IPv4套接口地址结构IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中<netinet/in.h>struct sockaddr_in{ uint8_t sin_len;//整个sock...

2019-04-22 20:45:19 379

原创 多线程顺序打印ABC、实现读写锁

1、多线程顺序打印ABC#include<stdio.h>#include<sys/types.h>#include<semaphore.h>#include<pthread.h> sem_t sem_id1, sem_id2, sem_id3; void* func1(void*); //声明void* func2(void...

2019-04-11 16:35:29 392

原创 Linux线程同步

先来看一个程序:raven@raven-pc:~/clinux/thread$ vim number.c #include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<sys/stat.h>#include<sys/ty...

2019-04-10 00:00:44 247

原创 Linux多线程

有了进程,为什么要引入线程?进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上:1、进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。2、进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,...

2019-04-09 23:11:12 806

原创 Linux守护进程、进程组、会话

1、守护进程的特点1)、后台服务进程2)、独立于控制终端3)、周期性执行某任务4)、不受用户登录注销影响(关机肯定影响)5)、一般采用以d结尾的名字(服务)2、进程组1)、进程的组长组里边的第一个进程进程组的id==进程组的组长的id2)、进程组组长选用规则进程中的第一个进程3)、进程组的id的设定进程组的id就是组长的进程id3、会话1)、创建一个会话注...

2019-04-09 17:49:32 328

原创 Linux进程之间的通信--信号

1、特点1)、简单2)、携带的信息量少3)、使用在某个的特定的场景中2、信号的状态1)、产生键盘:ctrl+c命令:kill系统函数:kill软条件:定时器硬件:段错误,除0错误等2)、未决状态—没有被处理3)、递达忽略捕获执行了默认动作3、处理方式4、信号四要素名称、编号、动作、注释5、概念存在pcb中,所以在内核中,用户不能直接操作阻塞信号集:...

2019-04-06 16:20:30 223 2

原创 Linux进程之间的通信--内存映射区mmap

mmap创建内存映射区域作用:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件函数原型: #include <sys/mman.h>void *mmap( void *addr,//映射区首地址,传NULL size_t length, //映射区的大小 int prot, //映射区权限 int flags, //标志位参数...

2019-04-06 00:09:39 434

原创 操作系统---内存管理

内存管理内存管理的功能有:1、内存空间的分配与回收:由操作系统完成存储器空间的分配和管理,是程序员拜托存储分配的麻烦2、地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址可能不一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。3、内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。4、存储保护:保证各道作业在各自的存储空间内运行,互不干扰。...

2019-04-04 23:59:01 338

原创 Linux进程之间的通信--管道

进程之间的通信什么是IPC?进程间通信,InterProcess Communication进程间通信常用的4中方式管道----------简单信号----------系统开销小共享映射区----(有无学院关系的进程间通信都可以)本地套接字-----稳定什么是管道?本质: 内核缓冲区 伪文件-不占用磁盘空间特点: 两部分: 读端、写端,对应两个文件描述符 数据写...

2019-04-04 21:09:05 330

原创 Linux文件IO

Linux文件io首先要知道文件描述表,通过这张表就可以找到对应的文件。从0开始编码到1023一共1024个。每个进程的前三个默认打开,也就是0,1,2分别指向标准输入、标准输出、标准错误三个文件,可以不用open直接使用。pcb本质是结构体一个进程有一个文件描述表:1024前三个被占用文件描述符的作用,通过他们找到对应的磁盘位置。打开文件int open(const char *...

2019-04-03 18:34:49 275

原创 C/C++ string,char * p

#include<string>#include<cstdlib>#include<cstdio>#include<iostream>using namespace std;int main() { char * cstr = (char *)malloc(100); scanf("%s", cstr); //在...

2019-04-02 17:32:01 490

原创 Linux系统编程

一、进程的概念1、程序和进程  程序:二进制文件,占用磁盘空间  进程:启动程序    所有的数据都在内存中    需要占用更多的系统资源2、并发和并行  并发是在某个时间段内并发,比如在7点到8点回家、吃饭在这个时间段内,回家和吃饭并发  并行是某个时刻的并行,比如在7点10分,我吃饭的时候看着新闻,同时进行的二、进程控制fork函数,在进程执行到fork()函数的时候,会产...

2019-03-29 21:54:52 1502

转载 平衡二叉排序插入新节点后平衡调整

LL(右单旋)插入根节点左孩子左子树RR(左单旋)插入根节点右孩子右子树LR(先左后右双旋转)插入根节点左孩子右子树RL(先右后左双旋转)插入根节点右孩子左子树以下来自王道:...

2019-03-26 17:57:28 590

原创 B树、B+树

B树与B+树的区别在于:1)在B+树中,具有n个关键字的节点只含有n棵子树,即每个关键字对应一颗子树;而在B树中,具有n个关键字的节点有n+1棵子树2)B+树:每个节点(非根节点)关键字个数【m/2】<=n<=m (根节点:1<=n<=m),在B树:[m/2]-1<=n<=m-1(根节点:1<=n<=m-1)3) 在B+树中,叶节点包含信息,...

2019-03-26 15:40:08 4993 1

原创 设计模式之单例模式

饿汉式//恶汉模式class Single {public: static Single* getInstance();private: Single(); Single(const Single &s); Single & operator=(const Single &s); static Single *instance;};Single::S...

2019-03-25 23:01:06 160

原创 C语言中常见的库函数实现

#include<stdlib.h>#include<stdio.h>#include<string.h>#include<assert.h>//设置void * mymemset(void * src, char c, int n) { assert(src != NULL); char * p = (char*)src; w...

2019-03-19 22:34:28 566

原创 函数指针、函数指针做函数参数

数组类型如何定义typedef int(MyArray)[5];//这是我定义的数组类型,这个类型的名字是MyArray,它的本质是一个内存固定大小模板MyArray arr;//arr是一个数组(大小为5)类型的变量。可以这样访问arr[0] arr[1] arr[2]typedef int (*MyP)[5];//定义一个数组指针类型,这个指针指向大小为5的数组。MyP p;//...

2019-03-19 19:39:43 197

原创 C++中的继承

继承方式的不同,成员变量在子类中的权限不同继承方式publicprotectedprivatepublicpublicprotectedprivateprotectedprotectedprotecedprivateprivateprivateprivateprivate1、子类拥有父类中所有成员变量和成员函数2、子类就是一种特殊的父类3、子类对象可以当做父类对象...

2019-03-19 19:18:54 512

原创 C++友元函数、友元类

class A {private : int a; int b;public: A() { a = 100; b = 200; } int geta() { return this->a; } friend void seta(A *p, int a);//声明一个友元函数,是这个类的好朋友,在类定义的地方,也就是类外可以访问类的私有变量};void s...

2019-03-19 18:35:08 151

原创 C++重写、重载、重定义、名称覆盖

代码如下:parent: --------------------------------------------------child:void print()--------------------------------------------void print() //重定义void print(int i,int j) //和父类中的print()重...

2019-03-19 18:24:34 197

原创 C++ 虚函数、多态

所谓多态就是相同的调用,得到不同的结果。一种调用多种状态。实现多态必须满足三个条件:1、有子类继承 2、有虚函数重写 3、要有父类指针(父类引用)指向子类对象class Parent {public: Parent(int a = 0) { this->a = a; } //第一个动手脚的地方,编译器应该对这个虚函数,特殊处理 virtual void print()...

2019-03-19 17:24:21 137

原创 C++运算符重载+,前置++后置++,友员函数实现运算符重载的应用场景

为什么要有运算符重载?一些用于自定义类型,编译器不知道如何进行类型的运算。运算符重载的本质是函数。用两种方法实现运算符重载:1、重载为成员函数,解释为:ObjectL.operator op(ObjectR),左边操作数ObjectL通过this指针传递,右操作数由参数Object传递2、重载为友员函数,解释为:operator op(ObjectL,ObjectR),左右操作数都有参数...

2019-03-17 23:32:41 2162 1

原创 C++中static

class Demo{public: int getC() { return c; } static void get() {//静态成员函数,属于整个类,在静态数据成员函数中, //是不能调用具体的对象的变量的,不能调用普通的成员变量,以为它公共的,不知道调用的哪个对象的变量 //但是它可以访问静态成员变...

2019-03-11 21:25:17 121

原创 malloc和free、new和delete

1、new delete 操作符号 是c++关键字2、malloc free 函数 c语言3、new和malloc都是在堆上分配内存//分配基础类型int *p=(int *)malloc(sizeof(int));free(p);int *d=new int;//同上,从这里可以看出malloc需要计算出字节个数,而new不用计算。delete d;int * d2=new...

2019-03-11 21:12:44 224

原创 C++类析构函数

析构函数是C++释放类对象的函数,如果在类中不写析构函数,C++编译器会自动补上析构函数。如果人为定义了析构函数,那么会调用人为定义的。默认析构函数不会释放成员指针变量所指向的内存空间,如果要释放的话,还需要人为定义释放。析构函数在对象释放的时候自动调用,在delete 删除对象的时候,也会调用析构函数。class Demo {public: Demo() { //无参数构造...

2019-03-11 20:57:17 2095

空空如也

空空如也

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

TA关注的人

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