- 博客(46)
- 收藏
- 关注
原创 KMP算法
又因为sub[i]==sub[k],故sub[0]...sub[k]=sub[i-k]...sub[i],即next[i+1]=k+1;证明:由于next[j]==k,所以可知:sub[0]...sub[k-1]=sub[x]...sub[i-1],可得x=i-k;=sub[k],此时让k回退直至出现sub[i]==sub[k]的情况,即令k=next[k](1)当回退到的位置和当前字符一样时,就写回退到的位置对应的nextval值。sub[i]==sub[k],此时next[j+1]=k+1。
2024-10-28 11:55:14 341
原创 笔试题目解析1
2>优化解法:定义两个变量记录str1,str2的下标,再用一层for循环遍历数组中的字符串,若s==str1,到s的前面去找str2的位置,若前面有str2,则更新两者间的最短距离,再更新str1的位置信息;若s==str2,到s的前面去找st12的位置,若前面有str1,则更新两者间的最短距离,再更新str2的位置信息。给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。
2024-10-15 10:28:54 255
原创 双指针思想
3)判断:若是窗口内元素之和大于等于目标值,计算此时窗口的长度,更新最小长度,同时让left指向的元素出窗口;1)定义两个指针cur,dest:让cur指向数组的nums[0],用来遍历数组;当cur指向的元素不为0时,让dest++,同时交换两个指针指向的元素,cur++注:该思想是根据单调性,当在某处可以完成要求后,若再进数据势必不会是所求的可能结果。<1>利用快慢双指针确定链表的中间节点,链表是否带环,带环链表的入环点在哪里。2)进窗口:让right指向的元素进入[left,right]的窗口内。
2024-09-08 17:15:37 359
原创 stack和queue的模拟实现
注:stack和queue的底层均可由vector和list实现,所以在模拟实现stack和queue时,我们可以传一个容器,借助该容器的相关成员函数实现新的类,为了适用性,在调用容器的成员函数时需选用vector和list都有的函数,但是若是选用deque这一容器适配器,则不用考虑这么多,因为deque包含vector和list的相关内容。1.priority_queue的默认底层容器是vector,而vector使用堆算法将元素存储成堆的结构。三.priority_queue的模拟实现。
2024-08-01 11:30:58 343
原创 list的模拟实现
等操作,所以为了实现迭代器,需要封装一个类模板list_iterator,又因为在类模板list中,迭代器需要被频繁调用,故而选用struct将成员变量和成员函数均设为共有。1>成员变量:_data(该节点存储的数据),_next(下一个节点的地址),_prev(前一个结点的地址)(1)记录pos位置的前一个结点和后一个节点,完成两节点间新的连接关系,删除pos位置的节点。(1)将pos位置的节点,前一个节点分别记录下来,创建一个新节点,完成三个节点新的连接关系。1>list的构造函数:list()
2024-07-30 10:55:09 298
原创 vector的相关内容介绍及模拟实现
1>注意编译器不能在没有实例化的类模板里取东西,因为它无法区分const_iterator是类型还是静态成员变量,所以vector<T>::const_iterator it前面要加上typename表明它是类型,或者直接用auto让编译器自己去判断it的类型。1>需要注意的一点是要记录原来的有效字符个数,避免之后计算_finish的指向时调用size()时出现两个指针分别位于两块空间内的情况。1.vector是一个模板,不支持流插入和流提取,因为它支持多种方式的输出,不需要局限于流提取的方式。
2024-07-27 09:50:48 351
原创 string类的相关知识及模拟实现
2>对于含参构造函数,计算_size和_capacity的大小,由于_capacity不包含'\0',所以初始的_size和_capacity的大小相同,用new为_str开一块(_capacity+1)个字符大小的空间,注意此处要多开一块空间存储'\0',再用strcpy将str中的内容拷贝到_str中。6>resize(size_t n)与resize(size_t n,char c)都是将元素个数改为n个,不同的是,若是增加元素,前者用0填充,后者用字符c填充。
2024-07-25 11:42:08 488
原创 C++之模板初阶
1.重载的函数仅是类型不同,代码复用率低,只要有新类型出现就需要用户自己手动实现相应函数2.代码的可维护性低,一个出错可能重载的函数全部出错。3.实例化:类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,实例化的结果才是真正的类。3.原理:在编译器阶段,对于函数模板的使用,编译器需要根据传入的实参类型来推演生成对应的函数以供使用。1.定义:函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。返回值类型 函数名(参数列表)
2024-07-19 08:39:48 374
原创 C++的内存管理
1)new和delete是用户动态申请和释放资源的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new来申请空间,delete在底层调用operator delete来释放空间。1)new和malloc,delete和free基本类似,不同的是new,delete申请和释放的是单元素的空间,new[],申请的是连续空间,若new在申请空间时失败会抛异常,而malloc申请空间失败会返回NULL。同:从堆上申请空间,需要用户手动释放。
2024-07-18 17:45:12 648
原创 类和对象(补充)
7>静态成员变量不能再声明处给缺省值初始化,因为缺省值是构造函数初始化列表的,静态成员变量不属于任何对象,不走构造函数的初始化列表。2>内部类是一个独立的类,跟定义在全局相比,它只是受外部类的类域限制的访问限定符限制所以内部类不属于外部类定义的对象。2>外部友元函数可以访问类的私有和保护成员,友元函数仅仅是一个声明,不是类的成员函数。3>静态成员函数没有this指针,可访问其他静态成员,但不可访问非静态的。1>定义:如果一个类定义在另一个类的内部,则该类就叫做内部类。3>一个函数可以是多个类的友元函数。
2024-07-16 15:28:11 192
原创 C++之类和对象
1>编译器编译后,类的成员函数默认都会在形参的第一个位置增加一个当前类型的指针,即this指针。自动生成的赋值运算符重载对于内置类型成员变量会完成浅拷贝(一个字节一个字节的拷贝)\值拷贝,对于自定义类型成员变量会调用他的拷贝构造。类中的内容叫类的成员;一个类,在我们不写的情况下编译器会默认生成6个默认成员函数(但在大多数情况下,系统默认生成的不是我们想要的,所以我们还需自己实现)1>类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员时,需使用::作用域操作符指明成员属于哪个类域。
2024-07-16 08:26:10 583
原创 一些关于C++的基础知识
1.用inline修饰的函数叫内联函数,编译的时候C++编译器会在调用的地方展开内联函数,这样调用函数时就需要建立栈帧,可以提高效率。补:在进行变量间的运算时,编译器需要一块空间暂时存储表达式的求值结果,所以就临时创建一个未命名的对象即临时对象,临时对象具有常属性。1>对于const对象必须使用const引用,对于普通对象也可以使用const引用,因为对象在引用过程中访问权限只能缩小不能放大。2.在C++中,nullptr是一种特殊类型的字面量,可以转换成任意其它类型的指针类型,但不能转换成整型.
2024-07-09 19:19:50 999
原创 树与二叉树
1>定义:对于深度为K,有N个节点的二叉树,当每个节点都与深度为K的满二叉树中编号为1-n的节点一一对应时,则为完全二叉树。1.定义:一种非线性结构,由n个节点组成的一个有层次关系的集合,形状类似一颗倒挂的树。4>树的高度:树中节点的最大层次(结点的层次:从根开始定义,一般根为第一层)2>父节点:若一个节点含有子节点,则称它为该子节点的父节点。1>叶节点:度(一个节点含有子树的个数叫做度)为0的节点。3>子节点:一个节点含有子树的根节点称为该节点的子节点。1>有一个根节点,且根节点没有前驱节点。
2024-05-17 18:03:52 309
原创 顺序表的实现
3>使用realloc对原有数组增容,为避免申请失败导致原数组被置为NULL,先创建临时变量接收,待确认申请成功后,在将增容的数组赋给顺序表中的数组。1>因为我们是在内存中动态申请的空间,所以当不再使用时要销毁,将申请的内存还给计算机。1>这里指定位置理解为下标,且该位置应该是>=0,且<=size的。1>为了顺序表对所有类型数据的适配性,对数组类型采用自定义。2>从后往前实现数据的后移一位,将待插入数据放在首位。1>从指定位置处开始从前往后将数据向前移动一位。1>从前往后实现所有数据的前移一位。
2024-04-03 19:44:57 228 1
原创 字符串旋转问题
1.思路:将首元素先提取出来,再将剩余元素依次向前移一位,最后将提取出来的首元素放末 尾(左旋可参照此思路)2.或许有的人刚拿此题就想先从完全不一样的情况下手,但该思路不适用与此题哦。1.思路:分左旋和右旋两种情况考虑,利用循环实现旋转不同位数时可能出现的结果。问:现有一个字符串,将字符串左边k个字符旋转到右边,用C语言如何实现?问:现有两个字符串,写函数判断是否一个字符串为另一个字符串旋转后所得。提示:1.这题不建议从反面考虑,因为可能结果多且杂;
2024-01-30 10:42:53 349 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人