C++
种起水稻
这个作者很懒,什么都没留下…
展开
-
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 · 122 阅读 · 0 评论 -
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 · 1741 阅读 · 0 评论 -
动态绑定与静态绑定
从名字上就可以看出动态绑定:即需要编译器动态的处理:需要用到的时候再编译,需要编译的时候才已知静态调用:编译前必须定义动态绑定需要的条件:1.以指针形式2.用的必须是虚函数3.必须是向上转型:(通俗的来讲就是基类指针指向->派生类对象)前两点很好理解主要是第三点首先我们需要知道的就是子类拥有基类的“一切”--------非私有那么基类可以是派生类的一部分,也可以不是,所以基类不可以隐式转换为派生类,但是可以通过基类的指针来使用派生类对象中的基类部分。动态绑定更多用来实现多态,以及原创 2021-03-27 12:43:12 · 163 阅读 · 0 评论 -
快慢指针证明(数学证明)
这里说一下我对快慢指针为什么快指针一定要是2倍速的理解:在判断链表有无环中,一般刷过力扣的都知道用快慢指针解而快慢指针就是一个慢指针和一个快指针这里我们需要确定的几个前提:1.快指针一定比慢指针要先到达环中2.当慢指针到达环的起点时,快指针要么直接与之相遇,要么在环中的任意位置从第2点出发这里就变成了追逐问题快指针何时能追上慢指针假设快指针速度为V2,慢指针速度为V1给予极限情况,慢指针无限趋近于快指针那么我们可以假设快指针至少需要跑2*PI*R的距离去追赶慢指针那么可以得出花费的时原创 2021-03-23 22:00:15 · 843 阅读 · 0 评论 -
数组和链表的区别
数组的特点:1.在内存中是一块连续的,固定的一段的空间------数组必须在初始化时就指定空间大小2.数组无法快速实现在头部或尾部添加或删除新的元素,因为需要把数组整体都进行移动3.数组可以在O(1)内访问某个位置的元素链表的特点:1.链表的内存是分散的2.链表可以在O(1)内实现在头部或尾部添加或删除新的元素,只需要改变指针的指向就行3.链表即使知道元素的位置也必须要遍历过去,因为地址的不连续,必须要依靠指针来实现地址的跳跃所以两者的适用范围就明确了在明确数据范围以及不需要进行数组的删除原创 2021-03-21 21:29:25 · 157 阅读 · 0 评论 -
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 · 973 阅读 · 0 评论 -
友元函数
如果类内的某些数据类型是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 · 500 阅读 · 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 · 150 阅读 · 0 评论 -
pubilc与private,class与struct
pubilic和private都为访问说明符pubilc:成员在整个程序内可被访问private:仅可以被类内的成员函数访问,不可以被使用类的代码访问class与struct的差别在于两者的默认访问权限不同struct默认成员是pubilcclass默认成员是private...原创 2021-02-27 12:30:52 · 1656 阅读 · 0 评论 -
构造,拷贝,赋值与析构
任意一个类有会有其对象被初始化的方法,主要通过一个或几个特殊的成员函数来控制,而这些函数就叫做构造函数特点 :1.构造函数的名字与类名相同,但是不需要返回类型2.一个类可以有一个或多个构造函数,与重载函数差不多3.构造函数不可以被声明为const,因为当创建类的const对象时,直至对象初始化结束,对象才会真正获得const常量属性,所以构造函数可以对const对象的构造过程中写值4.如果没有特意写构造函数,系统会自动生产默认构造函数,但如果自己写了,那么就必须通过自己写的一个或数个构造函数来实现原创 2021-02-26 12:47:51 · 136 阅读 · 0 评论 -
顶层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 · 1089 阅读 · 0 评论 -
归并排序
今天学习归并排序重点其实就是利用树的结构来从 部分有序 -> 整体有序因为是遍历一遍树所以没有最好最坏的情况时间复杂度永远是O nlogn但是因为要建一个辅助数组来保存有序数组的原因所以需要额外的空间空间复杂度 O n与快排的不同就是递归的顺序归并可以从字面意思理解先归再并可以参考如下图片可以发现先是拆成单个节点,然后再去比较代码: bool judge(int l,int r,vector<int>& nums) //必须加&原创 2021-02-09 12:42:50 · 73 阅读 · 0 评论 -
快速排序
开始学习算法----快速排序冒泡排序的复杂度正常来说是O(N^2),当然可以变成设立一个flag当一次循环结束没有发生交换就退出的加强版冒泡,但是似乎还是没有快排O(nlogn)来的快快排是基于一种分治思想的排序,就是设立一个基准值,然后把比基准值小的放左边,比基准值大的放右边,从 l---r 变成 l---index-1 index index+1-------r然后继续在 l—index-1 和 index+1-------r中进行同样原创 2020-12-23 20:13:15 · 97 阅读 · 0 评论 -
static关键词
static局部区域:局部静态变量在程序的执行路径第一次经过对象定义语句时初始化, //这里注意,如果没有被人为定义初始化,那么会默认为 0之后不再被初始化,直至程序终止才被销毁.基本类似于全局变量,但是这是定义在函数内部的全局变量,所以只在这个函数内部有效#include <stdio.h>void fn(void){ int n = 10; printf("n=%d\n", n); n++; printf("n++=%d\n", n);}原创 2021-01-31 14:34:45 · 56 阅读 · 0 评论 -
const和define
const首先大部分场合就是定义一个常量(不可修改的数)定义的同时必须要初始化const int a=110;当然也可以在函数调用中,防止被修改void xxxx(const int a){ a=10; //此时就会报错,因为a是一个常量}对于const对象:1.只能调用对象内的const成员函数2.所有对象都可以调用类中的const成员函数 const int *age3 = 23; int val1 = 101; *age3 =原创 2021-01-20 18:42:55 · 103 阅读 · 0 评论