自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】bind为什么会出现地址重用?bind: Address already in use

或许你遇到过这样的情况:关闭服务端之后,再次重启时一直报:Address already in use(地址重用)一段时间过后,再次输入 ./svr 时,服务端又能重启了???下面实际操作一下:1. 重启服务端:无法正常启动2. 一段时间过后:可以正常启动3. 看下端口状态并不是我们想象中的连接关闭了,而是处于一种 TIME_WAIT状态,也就是说19999端口仍然被占用着,因此会出现地址重用的提示如图:小结:先关闭连接的一端(服务端),在回复应答发送ACK之后会进入一个T

2020-12-31 09:26:55 2404 10

原创 【Linux】backlog是什么?

在TCP建立连接阶段,内核维护着两个队列:未完成队列: 正处于三次握手当中,客户端发送SYN过来,服务端回应SYN+ACK之后,服务端当前处于SYN_RECV状态,此时的连接在未完成队列中。完成队列: 已完成三次握手,客户端回应ACK之后,两边都处于ESTABLISHED状态,此时连接从未完成队列移到完成队列中。此时服务端调用accept,就从完成队列移除并返回新创建的sockfd。问题:如果backlog为1,那么完成队列很容易就满,满了以后客户端连接进来会怎么样呢?通过运行程序发现:客户

2020-12-29 19:16:51 1600 8

原创 【Linux】网络基础,你一定能涨知识的文章!!

文章目录1.网络和协议1.1 网络协议1.2 协议分层2.网络字节序与主机字节序1.网络和协议1.1 网络协议前提:为什么需要网络协议?计算机生产商很多,操作系统很多,网络硬件设备也有很多,为了使不同计算机能保证相互顺畅的通信,因此必须要一个共同的约定标准,这就是网络协议。协议: 通信双方对于通信进行约定,使用一种共同语言来进行有效沟通;网络协议: 在网络当中通信双方对数据交换和数据传输做出决定协议簇: 计算机当中有很多网络协议,将这些网络协议联系在一起就叫协议簇,(TCP/IP)参考模型或

2020-12-28 18:41:48 472 4

原创 【Linux】多线程,你绝对不能错过,详解!

多线程,线程安全什么是多线程?线程控制线程安全互斥锁条件等待1)什么是多线程?为什么要有多线程?一个进程中并不是只有一个main函数的执行流,而是有很多个执行流在同一时刻占用不同的CPU进行运算,我们称之为并行。同一时间有多个执行流在执行代码,程序的运行效率就可以大大提高。创建一个线程就相当于创建了一个执行流。什么是线程?线程就是创建出来的执行流,它在内核中拷贝当前进程的PCB并创建了一块PCB(task_struct结构体),和进程共用一块虚拟地址空间。1.创建一个进程(fork

2020-11-17 13:42:22 1005 3

原创 【Linux】进程信号,一看就懂!!

进程信号,未决信号概念信号的产生信号注册信号注销捕捉处理信号信号未决自定义信号处理函数1)信号概念查看信号列表:在bash中输入kill -l一共62种信号,其中方框里的是一些常见的信号2号信号:SIGINT(interrupt),bash中输入的ctrl+c3号信号:SIGQUIT,bash中输入的ctrl+|,会产生coredump文件6号信号:SIGABRT,代码中调用到abort()函数时,使当前进程接收到6号信号而异常终止,double free也会产生6号信号9

2020-11-11 19:14:43 742 2

原创 【C++】知识体系框图

2021-04-12 19:08:45 249

原创 【Linux】网络体系框图

2021-04-12 19:03:56 233

原创 【C++】开散列模拟哈希表

开散列(链地址法)原理:本质是链表集合(vector + list),将发生冲突的元素挂在同一个链表中。哈希表中没有直接存储元素,而存储的是链表首节点的地址映射关系:通过对元素 关键字(key) 取模数组容量,计算哈希地址哈希冲突:将产生冲突的节点挂载到同一链表中相较于闭散列:需要额外的指针域空间,但是不会影响别的节点查找和插入,整体插入、查找效率较高哈希节点(链表):// 哈希节点(单链表)template <class T>struct HashNode{ T

2021-04-05 16:52:14 234

原创 【C++】闭散列实现哈希表

文章目录哈希概念:闭散列(开放定址法):哈希概念:顺序结构以及平衡树中,查找一个元素需要时间复杂度为O(log2Nlog2Nlog2N),搜索效率较低理想搜索状态:不经过任何比较,通过某种函数使元素的存储位置和它的关键码之间建立一 一映射的关系,则查找通过该函数很快可以找到元素位置哈希表是一种以空间换时间的思想闭散列(开放定址法):底层使用数组存储元素映射关系:通过对元素 关键字(key) 取模数组容量,计算哈希地址哈希冲突:映射到的位置有不同 key 值元素线性探测:每次向后偏移

2021-03-25 22:09:00 169

原创 【笔记】LeetCode字符串匹配

文章目录最长不含重复字符的子字符串最长公共子序列最大重复字符串删除有序数组中的重复项最长不含重复字符的子字符串https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/解题思路:哈希表board + 双指针 (i, j),哈希表保存字符上次出现位置,i 保存没有重复字符的首地址动态规划:dp[i] 表示当前位置上最长的字符串,当不重复 dp[i] = dp[i-1] + 1,当

2021-03-24 15:34:55 573

原创 【C】模拟实现mem系列和str系列函数

memcpy函数原型:void* memcpy(void* _Dst, const void* _Src, size_t _Size);void* Memcpy(void* dst, const void* src, size_t count){ void* ret = dst; assert(dst); assert(src); while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (c

2021-03-22 09:14:56 157

原创 【Linux】知识体系框图

2021-03-19 21:56:20 253

原创 【剑指38】字符的排列

文章目录方法一:dfs + 剪枝:时间O(n!n!n!),空间O(n)方法一:dfs + 剪枝:时间O(n!n!n!),空间O(n)解题思路:对字符串进行全排列,将每次不同排列的结构插入数组中通过dfs + 循环遍历数组,并交换元素位置,实现全排列全排列过程中可能出现数组中多个元素重复占用同一位置,造成结果重复因此采用一个固定大小的数组,每排一次位置让元素对应下标++class Solution {public: vector<string> ans; vec

2021-03-11 15:47:23 61

原创 【剑指37】序列化二叉树

文章目录方法一:dfs:时间O(n),空间O(n)方法一:dfs:时间O(n),空间O(n)题解:序列化:规定序列化的格式:一个数据之后跟上逗号,如果空树则用 # 代替占位先序遍历二叉树,如果是空树则插入 #,如果不空则将数据转换成string类型并插入,最后添加逗号反序列化根据序列化的格式进行反序列化,如果当前字符是# 则赋空如果不是# ,则动态创建节点时间:O(n) 遍历二叉树的所有节点,遍历 string 的所有元素都是O(n)空间:O(n) 最坏情况二叉树是单支树

2021-03-11 15:18:03 62

原创 【剑指36】二叉搜索树与双向链表

文章目录方法一:中序遍历:时间 O(n),空间 O(n)方法一:中序遍历:时间 O(n),空间 O(n)解题思路:二叉搜索树的中序遍历是一个递增的序列因此遍历二叉树,回溯前需要记录前驱节点在左树回溯之后将前驱节点和当前节点进行链接题解记录一个头结点 head 和前驱节点 prev,对二叉树进行中序遍历左树回溯的时候进行判断,若head为空说明到达了值最小的头结点,让 head = prev = root若 head 不空,则将 root 的左树指向 prev ,prev的右树指向 r

2021-03-11 14:40:50 58

原创 【剑指35】复杂链表的复制

文章目录方法一:先链接再分离,时间O(n),空间O(n)方法一:先链接再分离,时间O(n),空间O(n)题解:复制每个节点,并将之链接到原链表中调整 random 节点指向,random的下一个节点(random不空)分离链表/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val

2021-03-10 15:24:10 65

原创 【剑指33】二叉搜索树的后序遍历

文章目录方法一:递归分治:时间O(n2n^2n2)、空间O(n)方法二:单调栈:时间 O(n),空间O(n)方法一:递归分治:时间O(n2n^2n2)、空间O(n)解题思路:利用后序遍历的特点:左树 | 右树 | 根结点,检查每个根的左右子树是否满足二叉搜索树特性若当前根结点满足搜索树特性,则继续在该节点的左右子树中检查题解:递归分治法:定义一个根结点,遍历数组,直到节点值比根结点大。记录当前的位置pos,继续向后遍历,后序节点应该满足都大于根结点。分治:检查pos位置两边的树,也就是

2021-03-10 15:20:25 56

原创 【排序】排序

快速排序概念:交换排序排序思想:分治法以一个数作为基准,将所有小于该数的元素放到左边,所有大于该数的元素放到右边也就是找到该数应该存在的 “位置”,然后将排序的数组分为该数之前和该数之后时间复杂度平均时间复杂度:O(nlogn),最坏情况下:O(n2n^2n2)当数据基本有序,或者数据成单只树的结构时,排序效率很低挖坑法:找到一个基准值key,从两边开始向中间遍历先从右边开始往左遍历,找到比key小的值,将这个值赋值给arr[left]再从左边开始往右遍历,找到比key

2021-03-09 22:36:25 88

原创 【C++】模板进阶,搞定泛型编程

文章目录一、模板的概念二、模板的特化三、类型萃取一、模板的概念模板概念:模板实现了通用类型的代码,不需要关心数据的类型,因此 C++标准模板库STL产生。模板可以分为:类模板和函数模板,其类型推导和具体代码生成都是在编译阶段。没有实例化的模板:编译器只是对模板进行简单的语法检测,并不会生成代码实例化之后:根据用户对模板实例化的类型来生成代码,并且对生成的代码进行语法检测模板类型的参数:类型模板参数:类型不确定的,实例化后才生成对应代码非类型模板参数:类型已经具体化如果有缺省或

2021-03-02 22:29:03 419 8

原创 【剑指33】二叉搜索树的后序遍历序列

方法一:分治思想:时间 O(n2n^2n2),空间 O(n)题解:利用后序遍历的规则:左树 | 右树 | 根节点,将后序遍历序列分成一个个子树检查每一颗子树是否满足二叉搜索树的特性:左树都比根节点小如果都满足则说明数组正确缺点:每次遍历数组都只能检测一个根节点,因此检查所有根节点需要O(n2n^2n2)的时间时间:遍历一次数组只能减少一个节点,而每次遍历都需要O(n)时间空间:当二叉树退化成单只树则需要O(n)的空间class Solution {public: bool ve

2021-03-01 15:40:18 124

原创 【C++】list接口及模拟实现

文章目录vector 和 list 的区别vector 和 list 的区别相同点:都是STL提供的序列式容器,包含在 std 的命名空间中vectorlist底层结构动态类型的顺序表带头节点的双向循环链表随机访问支持,访问元素时间复杂度O(1)不支持,访问元素O(n)插入/删除效率任意位置插入删除元素效率低 (搬移数据)任意位置插入删除效率高迭代器原生态指针对原生态指针进行的封装迭代器失效插入/删除/扩容删除应用场景访问元素较

2021-02-22 10:55:25 83

原创 【剑指32】从上到下打印二叉树 I、II、III

文章目录方法一:借助队列层序遍历:时间O(n),空间O(n)方法一:借助队列层序遍历:时间O(n),空间O(n)时间:遍历二叉树需要O(n)的时间空间:当为平衡二叉树时,最多有 (n+1)/2 个节点,也就是O(n)的空间复杂度题解:队列初始化插入根节点出队,把当前节点的值插入数组,如果节点左树不空则入队,右树不空则入队/** * Definition for a binary tree node. * struct TreeNode { * int val; *

2021-02-20 15:04:19 83

原创 【剑指31】栈的压入、弹出序列

文章目录方法一:模拟栈的插入删除:时间O(n),空间O(n)方法一:模拟栈的插入删除:时间O(n),空间O(n)题解:给出一个压栈和出栈序列,则这组序列入栈和出栈顺序可以唯一确定借助一个栈结构模拟栈的压入和弹出操作入栈:直接插入压栈序列的元素,每插入一个元素之后都要检测出栈:插入一个元素之后检测,栈内元件是否和出栈元素响应位置的元素相同,如果相同则出栈最后检测栈是否为空,则可以判断出栈顺序是否正确class Solution {public: bool validateSta

2021-02-20 14:49:35 100

原创 【剑指30】包含min函数的栈

文章目录方法一:双栈模拟最小栈:时间O(1),空间O(n)方法一:双栈模拟最小栈:时间O(1),空间O(n)题解:要保证push(),pop(),min()等函数的时间复杂度都是O(1),因此我们管理一个最小栈,专门用来存放当前栈中最小的值push():push栈直接插入,min栈:判断栈顶元素和插入元素的大小,如果插入元素较小或者相等则插入pop():push栈直接删除,min栈:判断栈顶元素是否和push栈删除的元素相同,相同则删除class MinStack { privat

2021-02-19 16:57:17 148

原创 【剑指29】顺时针打印矩阵

文章目录方法一:模拟路径:时间O(nm),空间O(1)方法一:模拟路径:时间O(nm),空间O(1)题解:模拟矩阵的遍历方法,按层划分,一层一层的打印,直到打印完最内层的元素从左到右遍历上侧元素,依次为(top, left) 到 (top, right)从上到下遍历右侧元素,依次为(top + 1, right) 到 (bottom, right)如果 left <right && top < bottom 说明可以向左遍历,依次为(bottom, right -

2021-02-19 16:44:02 65

原创 【C++】string类接口及模拟实现

目录string介绍string常用接口string模拟实现小标题4小标题51)string介绍C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。C++封装了这些接口和操作,创建出string类string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。不

2021-02-19 12:41:10 177

原创 【剑指28】对称二叉树

文章目录方法一:左右子树是否对称,时间O(n),空间O(n)方法一:左右子树是否对称,时间O(n),空间O(n)题解:对于两个对称的节点有node1->val == node2->val,两节点值相同node1->left->val == node1->right->val,node1的左树和node2的右树相同node1->right->val == node2->left->val,node1的右树和node2的左树相同/**

2021-02-18 20:33:23 59

原创 【剑指27】二叉树的镜像

文章目录方法一:递归后序遍历二叉树:时间O(n),空间O(n)方法二:借助栈先序遍历:时间O(n),空间O(n)方法三:借助队列层序遍历:时间O(n),空间O(n)方法一:递归后序遍历二叉树:时间O(n),空间O(n)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int

2021-02-18 20:05:09 59

原创 【剑指26】树的子结构

文章目录方法一:先序判断每个节点:时间O(mn),空间O(m) m>n方法一:先序判断每个节点:时间O(mn),空间O(m) m>n题解:先序遍历二叉树A判断二叉树A节点node为根,二叉树B能否构成子结构,接口 isSubStructure() 先序遍历二叉树 A ,recur() 判断是不是子结构/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeN

2021-02-18 19:59:59 62

原创 【剑指25】合并两个排序的链表

文章目录方法一:重新拼接两个链表:时间O(mn),空间O(1)方法二:递归(不创建头结点):时间O(mn),空间O(m) m>n方法一:重新拼接两个链表:时间O(mn),空间O(1)题解:建立头结点将两个链表按大小顺序拼接到头结点之后循环结束,将剩下的一节拼接到后面/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Lis

2021-02-18 19:46:02 53

原创 【剑指24】反转链表

文章目录方法一:递归:时间O(n),空间O(n)方法二:迭代:时间O(n),空间O(1)方法一:递归:时间O(n),空间O(n)题解:回溯的时候将每个节点的下一个节点的指针域指向当前节点,并且把当前节点的next指针域设置为空当前节点next指针域不为空则进行递归,否则返回当前节点在回溯的时候将每个节点的next->next指向当前节点,并把当前节点next置空防止环形链表返回新的头结点/** * Definition for singly-linked list. * stru

2021-02-09 18:31:41 51

原创 【剑指22】链表中倒数第K个节点

文章目录方法一:快慢指针:时间O(n),空间O(1)方法一:快慢指针:时间O(n),空间O(1)题解:双指针,一个指针先走k步,然后两个指针同时向后移动,直到快指针为空,返回慢指针k大于链表的总结点数:返回头结点,快指针跑到了空/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),

2021-02-09 16:17:53 58

原创 【剑指21】调整数组顺序使奇数位于偶数前面

文章目录方法一:首尾指针:时间O(n),空间O(1)方法二:快慢指针:时间O(n),空间O(1)类似题目方法一:首尾指针:时间O(n),空间O(1)题解:交换首部的偶数和尾部的奇数,然后让指针一个++,一个 - -,直到left >= right首部指针:只要 left 的数值为奇数,则一直++尾部指针:只要 right 的数值为偶数,则一直 - -class Solution {public: vector<int> exchange(vector<int&

2021-02-08 15:41:04 71

原创 【剑指20】表示数值的字符串

文章目录方法一:依次判断并标记:时间O(n),空间O(1)方法一:依次判断并标记:时间O(n),空间O(1)题解:数值有4种情况,即:正负号、小数点 、指数、数字,分情况处理这四种状态正负号:只能出现在数值首,或者 e 后一个位置小数点:只能出现在 e 的前面,且只能出现一次指数:指数的两侧必须有数字,即指数前后都要有数字,且只能出现一次数字:可以在任何位置出现其他:数字中其他出现则直接返回falseclass Solution {public: bool isNumber(s

2021-02-08 15:22:18 74

原创 【C/C++】AVL树的特点及模拟实现

文章目录AVL树的特点AVL插入后的四种场景代码实现AVL树的特点二叉搜索树可以使查找的效率提升到log2nlog_2nlog2​n,但如果数据基本有序那么二叉搜索树会退化成单枝树,查找效率相当于在顺序表中搜索数据,效率低。两种平衡二叉搜索树解决了这个问题:AVL树和红黑树AVL树特点:每个节点的左右子树高度差的绝对值不超过1,即降低了树的高度,从而降低平均搜索时间空树也是AVL树,AVL树的每颗子树都是AVL树因此AVL树每进行一次插入删除操作都要保证树的平衡AVL插入后的四种场景

2021-02-08 12:23:56 293

原创 【C/C++】你不能错过的C/C++内存管理!

目录C/C++内存分布C++中动态内存管理小标题3小标题4小标题51)C/C++内存分布先来看一段代码:int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10] = {1, 2, 3, 4}; char char2[] = "abcd"; char* pChar3 = "abcd"; in

2021-02-07 10:38:28 104

原创 【项目】基于C++搭建的OJ系统

文章目录环境搭建环境搭建#include <iostream>#include <string>#include "httplib.h"int main(){ // 1.创建一个Server类对象 httplib::Server http_svr; // 2.注册Get方法 http_svr.Get("/index", [](const httplib::Request& req, httplib::Response& resp){

2021-02-05 10:22:22 2701 1

原创 【剑指18】删除链表节点

文章目录方法一:双指针:时间O(n),空间O(1)方法二:单指针:时间O(n),空间O(1)方法一:双指针:时间O(n),空间O(1)题解:用两个指针,pre 代表前驱节点,cur 表示当前节点。遍历链表如果 cur 值和 target 相等则让 cur 的前驱指向cur 的后继class Solution {public: ListNode* deleteNode(ListNode* head, int val) { 1.双指针 if (h

2021-01-16 16:50:41 53

原创 【剑指17】打印从1到最大的n位数

文章目录方法一:不考虑大数溢出:时间O(10n10^n10n),空间O(1)方法二:大数打印:时间O(10n10^n10n),空间O(10n10^n10n)方法一:不考虑大数溢出:时间O(10n10^n10n),空间O(1)题解:不考虑大数溢出 int 的情况class Solution {public: vector<int> printNumbers(int n) { int count = pow(10, n); vector&lt

2021-01-16 16:33:00 54

原创 【剑指16】数值的整数次方

文章目录方法一:快速幂:时间O(logn),空间O(1)方法一:快速幂:时间O(logn),空间O(1)题解:注重细节:0 和 1 的 n 次方都是0和1正常循环求幂的时间复杂度是O(n)二分法求幂可将时间降到O(logn)class Solution {public: double myPow(double x, int n) { if (x == 0.0 || x == 1.0) return x; long e

2021-01-16 16:14:28 51

空空如也

空空如也

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

TA关注的人

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