自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 kmp算法

kmp的难点其实就是next数组的求解和匹配时的运用前提:主串: text 简写 t串匹配串: pattern 简写 p串最长公共前后缀: ABC XXXXABC 的相同前后缀即为ABC所谓的next数组就是当匹配失败时,为了尽量少匹配,那么就看看匹配串前面的x位能不能和最开头的x位相同,如果能的话,是不是不就用再匹配一遍这x位了呢?一般来说next数组求解就两种1.先求出[ 0 , n-1 ]的字符串的最长公共前后缀,然后整体后移1位,将next[0] 赋值为 -12.直接将nex

2021-06-10 20:27:29 120

原创 TCP小结

TCP的连接不是真正意义上的连接 ,而是通过序列号和ACK来维护一个概念上的“”连接“TCP的特点是可靠性传输那么它是如何在不可靠的IP协议之上实现可靠的呢?主要是这几点:1.序列号和ACK2.超时重传3.检验和纠错从TCP的三次握手开始分为 请求方 和 接收方1.请求方发送一个分组,其中将SYN置为1,并且将seq随机置数a作为初始序列号 --------并且转为SYN_SENT状态简单来说就是SYN就是发送一个连接请求,顺便告诉接收方,我这个发送序列是从a开始的2.接收方收到请求,

2021-05-09 20:28:54 145

原创 fork

int pid;pid=fork();fork可以根据返回值来判断此时是父进程还是子进程,以及是否出错一个返回值,但是返回两次,通过创造一个子进程来实现并发一个父进程,一个子进程,两者顺序由内核中的调度算法决定if(pid==-1){ //出错}else if(pid==0){ //此时是父进程}else{ //此时是子进程其实是子进程ID}子进程从父进程中继承整个进程的地址空间但是两者是独立的,例如 int a = 3; int

2021-05-05 21:49:09 108

原创 链接 小结

如果没有ide,我们如何去编译两个关联的文件?比如我在main.cpp中需要一个叫做add的函数,但是这个函数的定义我却放在了一个叫做add.cpp的文件中那么我如何将两者关联?这时就需要链接出场了从一个普通文件------->可执行文件 一般需要四步1.预处理2.编译3.汇编4.链接这里就可以发现,链接是发生在最后,当编译器和汇编器将代码转成ASCII汇编语言文件后,成为可重定位目标文件 .o后,就需要链接器发挥作用了这里说明一下为了构造可执行文件,链接需要完成的两点1.符号解

2021-04-27 21:45:21 79

原创 IP与MAC之间的差别

Ip地址--------为了更快的在网络上寻址工作在网络层MAC--------主机的硬件地址MAC工作在数据链路层需要注意的是我所说的更快----------即减少搜索次数首先我们可以想象每台电脑都有自己唯一的MAC码,可以想象成人的ID那么如果我要在网络中寻找一个人,如果只有他的ID,那么我是不是要遍历整个网络才能确保自己一定能找到那个人,那样花费的时间就太多了为了避免那些无效查找,我可以根据地域来区别不同的人,以此来快速找到一个人,这里就需要IP地址来快速选定范围,通过前缀的不同来迅速划

2021-04-14 21:07:14 156

原创 vector详解

vector----可以看成动态的数组它允许放一个vector的大小为12个字节原理就是vector这个模板类中由三个参数构成而这三个参数全是指针—3*4==121.start -----指向头部的指针2.finish -----指向尾部的指针3.end_of_storage-------指向最大容量的指针事实上vector中最大容量和尾部是不一样的,头和尾组成有数据的范围而最大空间是指该vector目前的最大容量每次在插入新元素时,vector会通过比较fin

2021-04-14 20:49:14 1716

原创 动态绑定与静态绑定

从名字上就可以看出动态绑定:即需要编译器动态的处理:需要用到的时候再编译,需要编译的时候才已知静态调用:编译前必须定义动态绑定需要的条件:1.以指针形式2.用的必须是虚函数3.必须是向上转型:(通俗的来讲就是基类指针指向->派生类对象)前两点很好理解主要是第三点首先我们需要知道的就是子类拥有基类的“一切”--------非私有那么基类可以是派生类的一部分,也可以不是,所以基类不可以隐式转换为派生类,但是可以通过基类的指针来使用派生类对象中的基类部分。动态绑定更多用来实现多态,以及

2021-03-27 12:43:12 158

原创 快慢指针证明(数学证明)

这里说一下我对快慢指针为什么快指针一定要是2倍速的理解:在判断链表有无环中,一般刷过力扣的都知道用快慢指针解而快慢指针就是一个慢指针和一个快指针这里我们需要确定的几个前提:1.快指针一定比慢指针要先到达环中2.当慢指针到达环的起点时,快指针要么直接与之相遇,要么在环中的任意位置从第2点出发这里就变成了追逐问题快指针何时能追上慢指针假设快指针速度为V2,慢指针速度为V1给予极限情况,慢指针无限趋近于快指针那么我们可以假设快指针至少需要跑2*PI*R的距离去追赶慢指针那么可以得出花费的时

2021-03-23 22:00:15 830

原创 数组和链表的区别

数组的特点:1.在内存中是一块连续的,固定的一段的空间------数组必须在初始化时就指定空间大小2.数组无法快速实现在头部或尾部添加或删除新的元素,因为需要把数组整体都进行移动3.数组可以在O(1)内访问某个位置的元素链表的特点:1.链表的内存是分散的2.链表可以在O(1)内实现在头部或尾部添加或删除新的元素,只需要改变指针的指向就行3.链表即使知道元素的位置也必须要遍历过去,因为地址的不连续,必须要依靠指针来实现地址的跳跃所以两者的适用范围就明确了在明确数据范围以及不需要进行数组的删除

2021-03-21 21:29:25 144

原创 2020年第十届C/C++ B组第二场蓝桥杯省赛真题

第一次参加蓝桥杯,做几套真题适应一下。第一题:门牌制作题目描述小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?题目分析前面几题直接爆搜,拼的就是速度题目代码ll judge(int a) { ll sum = 0; while

2021-03-16 21:37:11 951

原创 从源代码到可执行代码

首先总的过程肯定是:预编译–>编译–>汇编–>链接1.预编译扩展源代码-----即将以字符 # 开头的命令,插入到源代码中,并形成以 xxx.i 为后缀的文件例如#include<…>将这一类的头文件插入程序文本中从这一步也可以#define也是进行在预编译中其具体过程就是将所有#define 宏定义全部进行展开所有用到宏定义的地方都会被替换一个定义如果被多次引用,那么就会在内存中有多个拷贝2.编译对xxx.i文件进行语法,语义上的检查,并最终转换成汇

2021-03-06 13:17:35 561

原创 原码,反码,补码

首先先了解无符号数的编码方法例如1个字节4位设Xi来表示每个位,且每个位取值为0或1那么一个字节就为:X3 X2 X1 X0对于无符号数的真值就是X3*2^3 + X2*2^2 + X1*2^1 + X0*2^0那么范围即为[ 0 , 2^4-1 ]那么对于有符号数来说需要最高位来判断正负-----0为正,1为负所以对于1个字节的的范围即为[ -2^3, 2^3-1 ]因为正数最多只能到0111 1111而负数最多可以到 1111 1111 所以负数的范围要比正数多1那么对于64位

2021-03-05 17:47:17 439

原创 友元函数

如果类内的某些数据类型是private私有的,那么就无法从外部调用了如何让其他类或者函数访问这些私有数据呢这里就可以在类内加一条函数声明,声明这些函数是友元 friend即可class example {private: int a, b, c;public: example(int a,int b,int c):a(a),b(b),c(c){} friend void printf(example& a); //这里加一条友元声明即可};v

2021-03-03 16:23:27 483 1

原创 new,delete与malloc,free的区别

首先new,delete是c++关键字,需要编译器的支持malloc,free是c的库函数,需要头文件同时new在开辟内存时会根据数据类型自动分配,不需要人为指定而malloc则需要人为指定所需内存的尺寸等成功开辟内存后new返回的是与对象类型一致的指针而malloc是返回*void,需要人为进行强制类型转换当然也有失败的时候所以需要进行检测如果失败new会抛出bad_alloc异常malloc会返回一个空指针根据返回的不同,可以来判断是否开辟内存成功new的实现步骤1.先用

2021-03-02 21:34:57 149

原创 pubilc与private,class与struct

pubilic和private都为访问说明符pubilc:成员在整个程序内可被访问private:仅可以被类内的成员函数访问,不可以被使用类的代码访问class与struct的差别在于两者的默认访问权限不同struct默认成员是pubilcclass默认成员是private...

2021-02-27 12:30:52 1623

原创 构造,拷贝,赋值与析构

任意一个类有会有其对象被初始化的方法,主要通过一个或几个特殊的成员函数来控制,而这些函数就叫做构造函数特点 :1.构造函数的名字与类名相同,但是不需要返回类型2.一个类可以有一个或多个构造函数,与重载函数差不多3.构造函数不可以被声明为const,因为当创建类的const对象时,直至对象初始化结束,对象才会真正获得const常量属性,所以构造函数可以对const对象的构造过程中写值4.如果没有特意写构造函数,系统会自动生产默认构造函数,但如果自己写了,那么就必须通过自己写的一个或数个构造函数来实现

2021-02-26 12:47:51 122

原创 顶层const和底层const

首先概念:指针本事是一个对象,并且这个对象可以指向其他对象所以const修饰的是指针本身还是指针指向的对象就是个问题顶层const:指针本身是个常量 //可以表示任意的对象是常量,对任何数据类型都适用底层const:指针所指向的对象是常量 //与指针和引用等复合类型的基本类型部分有关举例:int i = 0;int *const p1 = &i; //const修饰对象p1,p1不可改变,所以是顶层constconst int ci = 42;

2021-02-18 14:51:10 1073

原创 剑指 Offer 68 - II. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1

2021-02-15 14:29:55 48

原创 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释: 节点 2 和节

2021-02-15 13:34:01 118

原创 剑指 Offer 67. 把字符串转换成整数

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一个非空

2021-02-15 12:30:45 59

原创 剑指 Offer 66. 构建乘积数组

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 100000左乘与右乘的结合利用变量l和r来表示前l-1的乘积和后r-1的乘积class So

2021-02-14 20:50:38 41

原创 剑指 Offer 65. 不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数假设:a的二进制1011b的二进制1110对于a,b相加的结果来说就是:0101 (不进位)//也就是异或操作而进位的结果就是1010这个值再往左移一位//与操作后左移随后将这两个值加起来这里的加起来这个操作又可以类似于a,b相加来重复上次的操作也就是将异或操作当作a与操

2021-02-14 20:42:31 38

原创 剑指 Offer 64. 求1+2+…+n

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出: 6示例 2:输入: n = 9输出: 45限制:1 <= n <= 10000什么都不让,至少还有一种特殊判断写法class Solution {public: int sumNums(int n) { return n==1?1:sumNums(n-1)+n; }}

2021-02-13 21:14:49 67

原创 剑指 Offer 63. 股票的最大利润

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。限制:0 <= 数组长度 <=

2021-02-13 21:08:47 42

原创 剑指 Offer 62. 圆圈中最后剩下的数字

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2限制:1 <= n <= 10^51 <= m <= 10^

2021-02-13 19:59:17 46

原创 剑指 Offer 61. 扑克牌中的顺子

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True限制:数组长度为 5数组的数取值为 [0, 13] .去重+大-小<=4class Solution {public: bool isStraight(vector<int

2021-02-12 19:40:33 65

原创 剑指 Offer 60. n个骰子的点数

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例 2:输入: 2输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08

2021-02-12 18:54:05 46

原创 剑指 Offer 59 - II. 队列的最大值

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”][[],[1],[2],[],[],[]]输出: [null,null,null,2,1,2]示例

2021-02-12 18:07:24 46

原创 剑指 Offer 59 - I. 滑动窗口的最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6

2021-02-12 13:08:33 50

原创 剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”限制:1 <= k < s.length <= 10000交换3此即可class Solu

2021-02-11 14:37:05 49

原创 剑指 Offer 58 - I. 翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a good

2021-02-11 11:47:11 119

原创 剑指 Offer 57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]限制:1 <= target <= 10^5A-B可以用数学等差数列公式求和,A-B的范围可以用滑动窗口求—因为连续序列要求必须至少两个数所以初始化l

2021-02-11 10:50:30 37

原创 剑指 Offer 57. 和为s的两个数字

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]限制:1 <= nums.length <= 10^51 <= nums[i] <= 10^6双

2021-02-10 20:08:10 52

原创 剑指 Offer 56 - II. 数组中数字出现的次数 II

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1限制:1 <= nums.length <= 100001 <= nums[i] < 2^31...

2021-02-10 19:03:26 54

原创 剑指 Offer 56 - I. 数组中数字出现的次数

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]限制:2 <= nums.length <= 10000熟悉的题,不过是将只出现一个的数从一个改成了两个假设只出现以此的数为A,B那么异或起来的结

2021-02-10 11:40:11 47

原创 剑指 Offer 55 - II. 平衡二叉树

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ 9 20/ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2/ \3 3/ 4 4返回 false 。限制:0 <= 树的结点个数 <= 10000左–右

2021-02-09 21:16:26 61

原创 剑指 Offer 55 - I. 二叉树的深度

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。提示:节点总数 <= 10000感觉这题库顺序不太对,这题应该放在前面一点/** * Definition for a binary tree node. * struct TreeNode { * int va

2021-02-09 20:35:13 47

原创 剑指 Offer 53 - II. 0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000和上一道一样的题,就是二分的运用,利用有序的特性,下标如果一样,那么需要找的值一样在右边l=mid+1如果不一样,那么需要找的值可能就是这个下标,所以r=mid

2021-02-09 16:05:29 44

原创 剑指 Offer 53 - I. 在排序数组中查找数字 I

统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000排序查找,很自然想到二分二分找位置,然后从左和右开始找即可class Solution {public: int search(vector<int>& nums, int targ

2021-02-09 13:19:02 57

原创 剑指 Offer 52. 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8

2021-02-09 13:02:48 123

空空如也

空空如也

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

TA关注的人

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