自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 strlen、strcpy、 memcpy实现

strlen实现int Strlen(const char * strSrc){ if(strSrc== NULL) return 0; int len = 0; while((*strSrc++)!='\0') { len++; } return len;}注意:计算char数组或者string长度的时候 结束符\n不参与计算sizeof(数组名)/sizeof(元素)同样能计算char数组长度,但是\0参与计算memcpy 与 strcpy函数原型:void *

2020-09-21 17:13:15 231

原创 智能指针shared_ptr实现

C++11提供了智能指针用于动态管理堆空间的内存分配与释放,通过维护智能指针这个栈对象使得当智能指针离开作用域时能够自动释放其管理的内存。其中,最常用的应该是shared_ptr, 提供了共享语义,也即多个指针共享同一个资源。实现原理维护一个指向资源的裸指针以及引用计数指针(都属于堆空间)。当智能指针离开作用域时,引用计数-1,当新生成一个智能指针时,引用计数+1,只有当引用计数=0时才会释放智能指针管理的内存空间。下面来看下shared_ptr的实现细节吧。#include <iostrea

2020-09-19 18:40:41 271

原创 C++11智能指针

C++动态内存管理是通过一对运算符完成, new/delete. new:在动态内存中对象分配一块空间并返回一个指向该对象的指针。delete: 通过指针销毁其指向的对象,并释放与之相关的内存空间。常见的两种问题是: 1. 忘记释放内存,内存泄漏2. 在还有其他指针指向对象的时候释放对象,造成指针引用非法内存---- 挂起引用智能指针被引入解决上述问题,在构造时分配内存,当离开作用域时负责自动释放指向对象的内存。C++98 提供第一种智能指针 auto_ptrauto_ptrvoid main(

2020-09-16 14:14:18 163

原创 C++ 11新特性

为了面试,冲冲冲!!!1. nullptr之前的编译器将NULL与0视为一种,那么对于一些函数void foo(char * );void foo(int);调用foo(NULL)可能会调用foo(int),这会导致重载发生混乱。为了区分空指针与0,引入nullptr。 nullptr可以隐式转化为任何指针类型。2. 类型推导auto引入auto 与 decltype实现类型推导。auto itr = vec.begin();auto i = 5;// int auto arr =

2020-09-15 01:04:02 241

原创 入栈、出栈顺序(卡特兰数)

卡特兰数公式:Catalann=∏i=1n−1Catalani∗Catalann−i Catalan_n = \prod_{i=1}^{n-1} Catalan_i * Catalan_{n-i}Catalann​=i=1∏n−1​Catalani​∗Catalann−i​公式:Catalann=1n+1C2nn=1n+1∗2n!n!∗n!Catalan_n = \frac{1}{n+1} C_{2n}^{n} = \frac{1}{n+1} * \frac{2n!}{n! * n!}Catala

2020-09-14 17:40:53 2800 1

原创 c++ 各种排序算法总结

概述常见的排序算法可以分为两大类:非线性时间比较类: 通过比较决定元素间的相对次序,最小时间复杂度为 O(nlogn)线性时间非比较类:不通过比较决定元素间的相对次数,线性时间运行算法复杂度1. 冒泡排序比较相邻元素的相对大小,如果反序则交换,如果是从小到大排序,那么第一次扫描可以确定最大的元素,第二次扫描确定次大元素,以此类推,需要n-1次扫描。代码:void bubbleSort(std::vector<int> &v){ int size = v.size

2020-09-11 21:36:00 326

原创 计算机网络杂乱知识点

划分子网问题:给 23.6.0.0/16划分128个子网,计算每个子网的ip地址数量。16表示子网掩码位数,ip地址一共是32位,那么只有后面16位能进行划分。128个子网需要用到7位,那么就还剩下9位。 9位一共需要512个ip地址,其中全0表示子网络号,全1表示广播地址,这两个不可以用。拓展知识点:子网号全0或者全1要看网络设备所使用的路由器协议支持不支持,以前的老版的协议都是不支持,新版本可以支持,老的书籍或者资料都不用全0和全1子网,新的允许用,完事。...

2020-09-11 15:58:21 113

原创 C++内存泄漏

内存溢出与内存泄漏:内存溢出指的是内存越界,一种常见情况是调用栈溢出,栈内存不足的一种。内存泄漏 内存申请后,用完没有释放,可用内存越来越少。内存泄漏是最难发现的错误之一,除非用完内存或者调用malloc失败,否则不会导致任何问题。windows平台下的内存泄漏检测:Visual Studio 调试器与C运行时库提供了一种检测内存泄漏的有效方法, 原理大致如下:内存分配需要通过C运行时库实现,在分配内存与释放内存时做好记录,然后在程序结束时对比分配内存与释放内存的记录既可以确定是否有内存泄漏问

2020-09-08 00:29:31 295

原创 linux下常用命令总结

进程相关:linux下 查看进程名以及占用端口查找进程pidps -ef(全格式) | grep 进程名grep是全局正则表达式输出的意思通过pid查看占用端口netstat -nap | grep 进程pidnetstat查看与网络层协议相关的统计数据3. 通过端口查看进程netstat -nap | grep 端口号top 动态显示当前占用资源最多进程信息kill 杀死进程 与top还有ps一起使用常用文件操作:cd 切换目录ls 显示目录信息touch

2020-09-07 23:51:25 76

原创 Linux系统下进程内存空间模型

Linux下每个进程都有一个虚拟内存空间,32系统下一般是 4G大小。其中包括:从高地址到低地址来讲分别有以下几种:整体上可以分为两种,内核区以及用户区,内核区中是一些用户代码不可见的区域,比如页表就存放在这个区域。用户区中从上到下分别是:a. 代码段: 可读不可写b. 数据段: 全局变量以及静态变量存放的区域c. 堆区: 动态内存,通过malloc, new 申请内存。d. 文件映射区域: 通过mmap系统调用,比如共享内存等映射物理空间的内存区域。e. 栈区:维护函数调用的上下

2020-09-07 23:00:13 540

原创 设计模式

设计模式的分类在设计模式这种书中提到的总共有23种设计模式,创建型、结构型以及行为型模式。创建型模式在创建对象的同时隐藏创建逻辑。结构型模式关注类与对象的组合行为型模式关注对象之间的通信常用的创建型模式有 工厂模式、抽象工厂模式,单例模式等等工厂模式:创建对象时不对客户端暴露创建逻辑。建立工厂类,对实现了同一接口的一些类进行实例的创建。工厂类类含有判断逻辑,决定创建哪一个产品类的实例。使用场景: 不同场景下创建不同的实例时。一般用于生成复杂对象,对于简单对象直接通过new完成创建即可.

2020-09-07 22:23:53 247

原创 leetcode 排列组合系列

排列组合是回溯算法的经典问题,有固定的模板写法,包括重复元素以及非重复元素。下面总结一下leetcode中的排列组合问题。排列排列问题一般是对原数组进行交换,然后维护一个全局变量的结果集合,每当符合要求将当前状态下的原数组加入到结果集合之中。题目: 46 全排列 vector<vector<int>> res; vector<vector<int>> permute(vector<int>& nums) {

2020-08-21 16:27:11 1556

原创 leetcode 二叉搜索树序列(hard)全局变量问题

题目 :面试题0409 二叉搜索树序列题目分析:根节点可以确定数组首个元素,然后递归求解左子树,右子树,确定由这两个子树确定的数组。需要注意的是, 不是两个数组整体组合,而是数组内的元素互相组合(第一次就错了),得到所有的组合,然后添加到结果中。 set<vector<int>> res; void backTrace(vector<int> &vc, vector<int> & left, vector<int

2020-08-18 15:21:26 251

原创 leetcode 二叉搜索树专题

二叉搜索树相比于一般的二叉树,拥有性质:根节点的数值大于左子树所有节点的数值,小于右子树所有节点的数值因此如果使用中序遍历二叉搜索树,得到的就是一个升序序列。遇见二叉搜索树的问题,一般从两个角度考虑,一: 利用 树+ 二叉搜索树的性质二: 利用中序遍历 + 二叉搜索树的性质题目:leetcode 96 不同的二叉搜索树题目分析: 二叉搜索树性质: 中序是递增序列,子树同样满足这个性质。从1到n中选择根节点考虑, 只能由根节点左侧的元素组成左子树,根节点右侧的元素组成右子树。递归+

2020-08-18 15:09:19 130

原创 数据结构——树

红黑树红黑树是一种特殊的二叉查找树,满足任意一个非叶节点的键值大于等于左边孩子的键值,小于等于右边孩子的键值。但与平衡二叉树不同,对孩子节点为根的子树深度要求没那么严格(深度差异不超过一),只要求其满足不超过二倍即可。红黑树的几个特性:每个节点包含颜色信息,红色或者黑色根节点是黑色叶子节点也是黑色(空节点)红色节点的孩子节点一定是黑色从一个节点开始的所有路径包含相同数目的黑节点黑高度:从节点出发x,到达叶子节点的任意路径上的黑色节点的数目称为黑高度,或者说阶。 (不包含节点x自身)

2020-08-15 16:49:45 69

原创 IO多路复用

IO多路复用技术本质就是: 通过一种机制,使得单个进程可以监视多个文件描述符,一旦某个描述符就绪(读就绪或者写就绪),就能够通知进程进行相应读写操作。文件描述符:linux下一切都被看做文件,包含普通文件,目录文件,设备文件,套接字等等。抽象为文件,提供统一接口,方便调用。为了将文件与进程对应上,对于进程打开的每个文件,内核会返回一个文件描述符。本质上其实就是一个非负整数。每个进程有一个文件描述符表,每个表的存储一个指向文件的指针,指向系统打开文件的表,然后打开文件表内存储指向inode的指针。.

2020-08-13 21:18:15 108

原创 操作系统基础知识2

虚拟内存技术内存管理是计算机系统内存管理技术的一种,是对主存的一种抽象概念。为每个进程提供了一个一致的、私有的地址空间。为每个进程提供一致的地址空间,简化内存管理保护每个进程的地址空间不被其他进程破坏,隔离了其他进程的地址访问将主存看做是磁盘空间的高速缓存,主存中只保存活动区域,并根据需要在磁盘与主存之间传送数据物理寻址与虚拟寻址计算机主存可以看做是M个连续字节组成的数组。每个字节都有唯一的物理地址,最简单的访问内存方式就是物理寻址。虚拟寻址:CPU通过虚拟地址访问主存,在访问之前虚拟地址

2020-08-12 11:24:48 259

原创 操作系统-1

进程一个具备一定功能的程序在一个数据集上的动态执行的过程。 是操作系统资源分配与调度的基本单元。一般有三部分组成:程序、数据集合以及进程控制块组成程序描述进程完成功能,控制进程执行的指令集数据集合是程序执行需要的数据与内存空间进程控制块PCB包含进程的描述信息与控制信息,是进程存在的唯一标志线程线程是任务调度以及执行的基本单位,从属于进程。一个标准的线程由线程ID、程序计数器(PC)以及寄存器和堆栈组成,而进程由代码、数据、内存空间、打开的文件集合和一个或多个线程组成。线程的并发执行

2020-08-11 19:49:24 98

原创 数据库相关树结构

平衡二叉树基于二分法的策略提高数据查找速度的一种二叉树数据结构相比于一般的二叉树结构,平衡二叉树采用一些算法(旋转等)保证数据的左右两边的节点深度相差不会大于1. 保证数据在二叉树上是分布平衡的。非叶子节点最多两个子节点非叶子节点值大于左边子节点,小于右边子节点非叶子节点左右两边层级数相差不大于1红黑树一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,red、black。通过对从根节点到叶节点路上颜色的限制,保证没有一套路径比其他路径长出两倍(弱平衡二叉树)。根节点是黑的

2020-08-11 10:37:40 134

原创 数据库基础知识-2

关系型数据库与非关系型数据库关系型数据库: 采用了关系模型来组织数据的数据库关系模型指的就是二维表格模型。关系:一张二维表格元组:二维表中的一行,记录属性:二维表中的一列,字段关系型数据库的优点:容易理解:相对于其他网状、层次等模型更容易理解使用方便易维护四种存储引擎数据库引擎指的是数据库底层的软件组织,对数据进行增删查改。不同存储引擎提供不同的存储机制、索引技巧等。MyISAM 、Memory、InnoDB、Archive数据库主从复制与读写分离主从复制来同步数据,然后通过

2020-08-10 22:23:15 110

原创 数据库索引

索引索引是一个排序的列表,列表包含索引的值以及包含这个值所在行的物理位置。优缺点:优点: 加速检索,减少io次数。缺点:索引本身也是表,占用存储空间。维护以及创建需要时间成本,而且操作数据库也会修改索引表。分类主键索引、唯一索引、普通索引、全文索引、组合索引主键索引: 根据主键建立的索引,不允许重复,不允许空值唯一索引: 建立索引的字段必须唯一,但是允许空值普通索引: 普通字段构建的索引,没有任何限制全文索引:用大文本对象的列构建的索引组合索引: 多个字段组合构建的索引,不允许空值。

2020-08-10 21:43:02 110

原创 数据库基础

事务的基本概念事务指的是一个操作序列,序列内的操作要么都成功,要么都不成功。事务四大特性ACID原子性 一个事务内的所有操作,要么全部完成,要么全部不完成。一致性 事务执行前后数据库的完整性约束没有被破坏,不破坏关系数据的完整性以及业务逻辑的一致性。隔离性 多个事务并发访问时,事务之间是独立的,不互相影响。持久性 事务一旦执行完成,对数据库所做的更改就持久保存在数据库之中,不会回滚。事务之间的相互影响脏读 一个事务读取另外一个事务未提交数据,这个数据是有可能回滚的。不可重复

2020-08-10 18:33:12 81

原创 TCP连接

RTT(Round Trip Time) TCP从发送数据包到收到响应消耗的时间。TCP需要解决的是 可靠传输以及乱序的问题。tcp超时重传发送数据之后开启一个计时器,一定时间内如果没有得到发送数据包的ACK报文, 那么就重新发送数据。参数 RTO(Retransmisson Timeout) 设置长,重发慢没有效率,性能差,设置短,重发快网络拥塞,更多超时。tcp滑动窗口可靠性、流控滑动窗口根据接收方接收数据的情况对发送方进行流量控制,从而减少网络负担。字节流分为四部分:

2020-08-09 14:36:39 134

原创 http、https

http 与 https的基本概念以及区别概念:http: 超文本传输协议, 是客户端与服务端之间数据传输的规范。 是一种基于传输层的TCP协议的应用层协议。https: 安全的http协议。 http下加入ssl/tls(传输层安全)层,对http协议传输的内容进行加密传输、身份认证。基于安全套接字的http协议。区别:2.1 URL: HTTP以 http:// 开头 , HTTPS以https://开头2.2 http数据是明文传输的,不安全, https在http基础上加入.

2020-08-08 13:54:27 407

原创 TCP+IP+DNS

TCP/IP协议族内容分层、多协议通信体系,包含四层协议系统,分别是应用层、传输层、网络层、数据链路层。1.1 数据链路层实现了 网卡接口 的驱动程序,通过mac地址访问介质,处理数据在物理媒介上的传输。(交换机)两个常用协议: ARP协议 以及 RARP协议, 实现ip地址与机器物理地址转换(mac地址)。1.2 网络层实现数据包的选路以及转发。 通信主机一般由多个中间节点连接的,网络层负责选择中间节点,确定主机之间的通信路径。(路由器)常用协议:IP协议(网络寻址)以及ICMP协议(用.

2020-08-07 15:59:54 323

原创 todo-lists-4

https://www.cnblogs.com/nieliu/archive/2012/05/04/2482223.htmlhttps://blog.csdn.net/hengliang_/article/details/89925543https://www.cnblogs.com/lichunyang321/p/9594196.htmlhttps://www.cnblogs.com/xiaofengwang/p/11291944.htmlhttps://www.cnblogs.com/tianc

2020-08-07 09:52:57 122

原创 todo知识点

TODO实用:https://blog.csdn.net/qq_38200023/article/details/88957912#commentBox算法数据结构相关:红黑树、散列表、AVL树、字典树各种排序的复杂度以及稳定性计算机网络:tcp/ip(握手 挥手 信号意义 超时重传 滑动窗口 拥塞控制 流量控制)http/https(长短连接、头压缩、服务端推送、二进制传输、各个请求类型、各种状态码tcp/udp 七层模型 四层模型 五层模型数据库:ACID 隔离级别 常用语句 锁

2020-08-07 09:49:35 173

原创 todo-list-3

https://zhuanlan.zhihu.com/p/43789231https://blog.csdn.net/Yang_yangyang/article/details/79702583https://blog.csdn.net/xiaoming100001/article/details/81109617https://www.cnblogs.com/shangyueyue/p/11049984.htmlhttps://www.cnblogs.com/zhuimengzhe/p/72901

2020-08-07 09:48:41 83

原创 todo-list-2

知识点二:https://blog.csdn.net/zhaohong_bo/article/details/90170316https://www.zhihu.com/question/307100151https://www.cnblogs.com/zgq0/p/8780893.htmlhttps://segmentfault.com/a/1190000020163883https://www.jianshu.com/p/6dde7f92951ehttps://www.cnblogs.com

2020-08-07 09:42:36 159

原创 todo-list 1

知识点1:https://zhuanlan.zhihu.com/p/150676736?from_voters_page=truehttps://leetcode-cn.com/problems/maximal-rectangle/https://leetcode-cn.com/problems/all-paths-from-source-lead-to-destination/https://www.cnblogs.com/jackge/archive/2013/04/22/3036374.htm

2020-08-07 09:35:37 118

原创 奇数位递增,偶数位递减,将其变为升序链表(c++)

题目描述:一个链表,奇数位升序偶数位降序,让链表变成升序的。比如:1 8 3 6 5 4 7 2 9,最后输出1 2 3 4 5 6 7 8 9这道题目可以分为三个步骤,一:对链表按照奇偶划分,分为一个升序链表 一个降序链表二:翻转降序链表三:合并两个升序链表代码如下:#include <bits/stdc++.h>using namespace std;struct node{ node * next; int val; node(int v):val(v), next

2020-07-24 17:21:50 779

原创 单调栈

定义栈内元素按照递增或者递减的顺序排列的栈适用问题单调栈分为单调递增与单调递减栈,可以用于获取下一个比当前元素大(小)的元素。当需要通过比较前后元素的大小关系时,可以使用单调栈解决问题。单调递减栈在队列中针对每个元素从右边寻找第一个比它大的元素在队列中针对每个元素从左边寻找第一个比它大的元素(从后往前)这两种解决问题过程一样,但是角度不同。使用下面这个例子来解释:有一本武功秘籍,根据先来后到的顺序教授人武功。但是在排队过程中,如果有武功更加高强的人发现前面的人武功不如自己,就会打

2020-07-05 10:24:41 252

原创 c++实现atoi以及itoa函数

atoi函数int atoi(char * str)将字符串转为整形数,跳过前面的空格字符,直到遇上数字或者正负号才开始进行转换,而在遇到非数字或者字符’\0’结束转化,然后返回结果(int)。当正溢出时返回INT_MAX,负溢出返回INT_MIN题目思路比较简单,但是有挺多细节地方:跳过前面的空格使用stringstream >> string正负号处理将第一个有效字符单独拿出来讨论,为+,为-,为数字,为其他。溢出处理int的范围是[−231,231−1][-2^{31

2020-06-27 17:26:22 558

原创 c++内存分配以及变量初始化

内存分配方式c++内存中分为5个区,分别是堆、栈、自由存储区、全局\静态存储区以及常量存储区堆: 操作系统维护的一块特殊内存,用于程序的内存动态分配。C语言使用malloc从堆上分配内存,free释放已分配内存。栈:执行函数时,函数的局部变量的存储单元是在栈空间创建,函数执行结束这些从存储单元会被自动释放。栈内存分配运算内置于处理器指令集上,效率很高,但内存容量有限。自由存储区:自由存储区是c++基于new操作符的一个抽象概念,凡是通过new操作符申请的内存都叫自由存储区。一般情况下,编译器在底..

2020-06-27 12:07:25 1497

原创 c++ 数组作为参数、返回值

数组作为参数写C++代码遇到数组作为参数,常常忘记怎么写形参,这里记录一下。一维数组作为参数传入数组 int []为了规范,常常需要将数组的size一同传入,这是因为C++/C遇到参数为数组时,不会去一个个拷贝数组内的元素(太过于耗时),此时数组在函数内退化为数组首地址。 使用sizeof(array)/sizeof(array[0])得到1,可以验证我们前面的说法。一般情况下,函数内经常需要使用数组的size,此时就需要我们将size传入函数。int sum(int array[],

2020-06-27 10:32:37 5923 1

原创 求数组两个元素与(&)、异或操作最大值

问题一: 给定一个数组A[n],求解max(A[i] & A[j]), 其中i!=j思路:暴力解法时间复杂度是O(n2)O(n^2)O(n2), 那么能不能找到其他方法优化时间复杂度呢?下面从不同角度出发去考虑:规律法对于&运算,如果想要最大化结果,那么尽可能使得高bit位的运算结果为1。考虑最高位,很容易想到,只有最高位都为1的两个元素运算才能保证运算结果中最高位为1。另外一种情况,还是针对最高位,如果找不到两个元素可以使得运算结果中的最高位为1呢,那么结果中的最高位只能

2020-06-25 17:53:12 1760

原创 leetcode滑动窗口最大值

题目描述:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值进阶:你能在线性时间复杂度内解决此题吗?暴力解法很直观的一种想法使用两层循环,第一层循环表示窗口的起始位置,第二层循环表示从起始位置开始的窗口。 vector<int> maxSlidingWindow(vector<int>& nums, int k) {

2020-06-24 18:42:57 90

原创 滑动窗口

最小窗口子序列-DP解法滑动窗口是一种双指针技巧的算法框架, 其算法时间复杂度较低。下面是leetcode中常见的几道可以使用滑动窗口解决的题目。一、最小覆盖字串题目链接:https://leetcode-cn.com/problems/minimum-window-substring/题目要求在S(source) 中找到包含T(target)中全部字母的一个字串,顺序无所谓,要求这个字串的最短长度。暴力解法,代码大概如下:for(int i=0;i<s.size();i++) ..

2020-06-24 17:43:49 210

原创 二分查找

发明KMP算法的Knuth大佬说二分查找:思路很简单,细节是魔鬼 二分查找真正的坑在于mid到底是加一还是减一,以及while里面到底是 < 还是 <=.下面根据常见的几个二分查找的场景尝试总结一下二分查找的编程框架,分为寻找一个数,寻找左侧边界,寻找右侧边界。在此过程中,对于mid以及while循环的细节问题进行编码检测,分析细节差异。二分查找框架int binarySearch(vector<int> nums, int target){ int left = 0,rig

2020-06-21 22:56:44 99

原创 杂乱知识点

面向对象与面向过程的区别面向过程是分析出解决问题需要的步骤,然后使用函数将这些步骤实现,调用的时候按照对应顺序进行调用优缺点:优点: 性能与面向对象高,类的调用需要实例化,开销较大,比较消耗资源,在单片机、嵌入式开发、linux等一般采用面向过程。相对来说不容易维护、复用以及扩展面向对象是将要解决的问题分解为各个对象,建立对象的目的不是完成一个步骤,而是为了描述某个事物在整个解决问题的过程中的行为。优缺点:优点:易维护、易复用、易扩展,面向对象具备封装、继承、多态的特性,系统更加

2020-06-21 11:07:45 81

空空如也

空空如也

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

TA关注的人

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