C++
CR7lmz
这个作者很懒,什么都没留下…
展开
-
C++ 红黑树、关联式容器map、set
在很久之前我们说过AVL树,其是一种完全平衡的二叉搜索树。这篇文章我们将介绍另一种也是我们比较常用的二叉搜索树:红黑树红黑树是在二叉树的基础上,给结点增加了两种颜色(红,黑),以及通过其特定的性质来保证:树中最长路径的的结点个数不会超过最短路径结点个数的两倍。因此红黑树是一个近似平衡的二叉搜索树。因此红黑是是一个仅此平衡的二叉搜索树。其时间复杂度为O(lgN),与AVL树相同。但是大量证明表...原创 2020-03-22 19:17:34 · 356 阅读 · 0 评论 -
二叉树的基本操作
因为个人对于二叉树的操作有些地方理解的还不是很到位,所以本篇文章来总结一下二叉树的一些基本操作。那么二叉树的相关概念,这里就不再赘述。(本文用的是链式结构表示二叉树)结点信息struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),left(nullptr),right(null...原创 2020-03-04 18:03:03 · 210 阅读 · 0 评论 -
数据结构 哈希搜索结构
我们之前学过的查找方法有很多:1.静态搜索顺序查找:O(N)。二分查找:O(logN)。2.动态搜索二叉搜索树:最优查询效率O(N)。AVL树:O(logN)。但是上述的查找都是要经过元素比较才能进行查找的。查询的效率取决于比较的次数。哈希结构我们理想的搜索方法是:不进行元素比较,而是对每个元素的存储格式进行改造,通过某种方式,将元素与存储结构建立一一对应的关系。这样就可以通过这...原创 2020-02-17 14:24:05 · 264 阅读 · 0 评论 -
牛客 丑数
题目要求:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解析思路:参考大佬:事无巨细,悉究本末(2楼)首先从丑数的定义我们知道,就是说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三...原创 2020-02-09 15:51:04 · 211 阅读 · 0 评论 -
牛客 把数组排成最小的数
题目要求:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路解析:刚开始没什么思路,只是想把越大的数转为字符串放在后面,越小的数放在前面。之后参考了一篇的博客,一下就明白了。https://blog.csdn.net/fanzitao/article/detai...原创 2020-02-08 17:32:18 · 175 阅读 · 0 评论 -
牛客 整数中1出现的次数(从1到n整数中1出现的次数
题目要求:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。...原创 2020-02-08 15:59:47 · 195 阅读 · 0 评论 -
牛客 字符串的排列
题目要求:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。递归算法的四个特性:1.必须有可达到的终止条件,否则程序将陷入死循环。2.子问题在规模上比原问题小。3.子问题可通过再次递归调用求解。4.子问题的解应能组合成整个问题的解。思路解析:这是个递归求解的问...原创 2020-02-07 17:05:52 · 239 阅读 · 0 评论 -
牛客 二叉搜索树与双向链表
题目要求:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。原创 2020-02-06 16:23:38 · 130 阅读 · 0 评论 -
C/C++ const用法
C/C++中const的用法1.修饰常量const int tmp;//tmp为常量,不可改变int const tmp;//tmp为常量,不可改变2.修饰指针主要是看const 在*前后,在 * 则指针指向的内容为常量,在 * 后则指针为常量(也就是指针的指向不能变)。const int *ptr;//指针所指向的内容为常量。int const *ptr;//指针所指向的内容为常...原创 2020-02-05 18:08:07 · 130 阅读 · 0 评论 -
牛客 复杂链表的复制
题目要求:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路解析:分为三步:1.复制每个结点,并将复制的结点放在原结点后面。(比如:复制A结点得到A1,将A1插入到A后面),这样做是为了找到复制结点的random指针域。...原创 2020-02-05 16:34:20 · 102 阅读 · 0 评论 -
牛客 二叉搜索树的后序遍历序列
题目要求:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路解析:由题目得到:因为是后序遍历,所以序列最后一个元素一定是树的根root。又因为是二叉搜索树,所以左子树所有的值小于root,右子树所有的值大于root。 因此我们可以通过遍历整个序列来在找到第一个大于root的值,从而找到左右子树,再递归...原创 2020-02-04 16:00:16 · 152 阅读 · 0 评论 -
牛客 顺时针打印矩阵
题目要求:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。解题思路:1.定义四个变量left、top、right、butt来规定矩形的左、上、右、下边界。2.打印第一圈的...原创 2020-02-02 17:40:17 · 140 阅读 · 0 评论 -
牛客 树的子结构
题目要求:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解决此题需要分为两步:1.在A树中找到与B树的根节点的值相等的结点R。2.再判断B树是否与A树中以R为根的子树具有相同的结构。第一步:1.递归遍历树A,在树A中找与B树的根节点的值相等的结点R。2.若找到进行第二步操作。3.若没找到,则返回false。代码实现如下:bool Ha...原创 2020-02-01 16:55:41 · 101 阅读 · 0 评论 -
C/C++ sizeof 与strlen 区别
sizeofsizeof是分配给对象实际所占的内存空间的大小,不受里面的内容限制。sizeof(…)是****运算符,由于是在编译时计算的,所以不能用来计算经过动态分配的内存空间的大小。实际上使用sizeof来返回类型以静态分配的对象、结构体、数组的空间,返回值和其内容没有关系。strlenstrlen是计算字符串的长度,以‘ \0 ’为字符串的结束标志。返回从第一个地址开始到‘ \0 ...原创 2020-01-27 16:51:24 · 121 阅读 · 0 评论 -
C/C++ 整型的上下限INT_MAX / INT_MIN
整型上下限C/C++中整数的最大值和最小值用常量INT_MAX和INT_MIN来表示。定义在limits.h。数值大小:因为int是32为,所以根据二进制规则:INT_MAX: 2^31-1=2147483647;INT_MIN: -2^31+1=-2147483648;所有超过这两个限值的树,都会出现溢出。如果使用的整数可能会超过这两个限值,则可以使用长整型long long ,64...原创 2020-01-18 18:41:10 · 2775 阅读 · 0 评论 -
C++ AVL树
AVL树平衡二叉搜索树我们知道当二叉搜索树退化为单支树时,该树就变得不平衡了,所以为了解决此问题,就引出了平衡二叉搜索树-----当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1,这样的树称为平衡二叉搜索树。平衡二叉搜索树有两种:其中一种为AVL树,另一种为红黑树。AVL树性质:1.必须是二叉搜索树。2.左右子树都是AVL树。3.左右子树高度之差(...原创 2020-01-11 17:47:00 · 144 阅读 · 0 评论 -
文件压缩
在开始之前,我们要知道以下几个内容。什么是压缩?所谓压缩,归根结底就是让文件变得更小,并且可以无损的还原。为什么对文件进行压缩?1.文件太大,为了节省空间。2.提高数据在网络上传输的效率。3.对文件进行保护(加密)。文件压缩的分类:1.无损压缩:源文件被压缩之后,通过解压缩还能还原成和源文件完全相同的格式。2.有损压缩:源文件被压缩之后,通过解压缩不能还原成和源文件完全相同的格式...原创 2020-01-08 17:16:09 · 2040 阅读 · 0 评论 -
C++ 二叉搜索树
二叉搜索树二叉搜索树又称为:二叉排序树,其也可以是一个空树,或者具有以下性质的树也可以被称为二叉搜索树:1.若左子树不为空,对于任意节点,比其左子树中任意节点都大。2.若右子树不为空,对于任意节点,比其右子树中任意节点都小。3.最左侧的节点一定是最小的,最右侧的节点一定是最大的。4.当对二叉搜索树进行中序遍历,得出来的是有序序列。二叉搜索树的操作:...原创 2020-01-05 21:22:05 · 250 阅读 · 0 评论 -
C++ 异常
异常先回忆一下C语言中处理错误的方式:1.终止程序:如assert、exit(0)。缺点:暴力,对用户不是很友好。2.返回错误码。(常用,错误码是Windows操作系统提供的)若用VS编译器,用GetLastError() 来获取最近一次发生错误的错误码。并且可以通过VS工具–错误查找的选项,来输入对应的错误码,来看对应的错误描述。但是仅限于一部分错误码描述,若要查特别大的错误码的描述,可...原创 2019-12-28 17:59:33 · 186 阅读 · 1 评论 -
C++ 智能指针
智能指针智能指针的使用以及原理:智能指针的思想:RAllRAll是一种利用对象声明周期来控制程序资源的一种技术。它可以在对象构造时获取资源,在对象析构时候释放资源,完全不用用户自己释放,当然也解决了用原生态指针的缺陷。RAll思想的好处:1.不用自己显示释放申请的资源,用户不用考虑什么术后该释放资源,将这些交给编译器即可。2.用这种方法,对象所需的资源在其生命周期内始终保持有效。下面...原创 2019-11-17 23:28:34 · 343 阅读 · 0 评论 -
C++ 多态
多态首先我们来说说什么多态?多态就是进行某个行为时,但不同的对象去会有不同的结果。举个例子:买电影票这个行为,普通人去买就是普通票,学生去买就是学生票。这种行为体现的就是多态。多态的实现条件前提:在继承体系下,继承权限是必须是public。1.基类中必须有虚函数(被virtual关键字修饰的成员函数为虚函数),在派生类中要对基类中的虚函数进行重写。(1)重写的时候,必须是在派生类中重写...原创 2019-11-05 17:37:25 · 185 阅读 · 0 评论 -
C++ 继承
继承概念:继承是使代码可以复用的重要手段,它允许在保持原有类性能的基础性进行扩展,增加功能产生的新类,这个类称为派生类或者子类,那么被继承的类就叫做基类或者双亲类。继承是类层次的复用。派生类:派生类是继承了基类中的成员变量。有以下代码可以验证:class base{public: void setbase(int year, int month) { _year = year...原创 2019-11-02 18:05:16 · 180 阅读 · 0 评论 -
C++ 模板的特化 模板分离编译
非类型模板参数模板参数分为:类型模板参数和非类型模板参数类型模板参数:出现在模板参数列表中能够,跟在class和typename之后。非类型模板参数:就是用一个常量来作为类或者函数模板的参数,在类或者函数模板中可将该参数当成常量来使用。 template<class T, size_t N>//(T为类型模板参数,N为非类型模板参数) class array { publ...原创 2019-10-28 18:37:54 · 184 阅读 · 0 评论 -
C++ STL总结
什么是STL?STL是标准模板库。STL是对常见数据结构的封装,以及通用的算法。算法可以操作任意类型的数据并且可以处理任意数据结构。STL六大组件容器:组织数据,对常见数据结构的封装。序列式容器: 对线性数据结构的封装----顺序表&链表序列式容器的接口分类:构造与销毁迭代器操作容量操作元素访问操作修改操作特殊操作string类容器:管理字符串。1.浅拷贝问题的...原创 2019-10-23 17:48:02 · 150 阅读 · 0 评论 -
C++ 容器适配器 以及 模拟实现stack queue priority_queue
容器适配器概念:适配器是一种设计模式,是将一个类的接口转换成客户希望的另外一个接口。为什么将stack queue priority_queue称为容器适配器在STL中并没有将stack queue priority_queue划分在容器的行列,这是因为其他的每个容器在底层都有自己的实现方式,而stack、queue、priority_queue只是在底层将其他容器进行了重新封装。...原创 2019-10-21 20:41:02 · 250 阅读 · 0 评论 -
C++ stack与queue 以及priority_queue
stack类概念:stack满足后进先出操作的环境,只能从容器的一端进行插入和提取的操作。stack的使用:stack<int> s;//构造空栈if (s.empty())//判断栈是否为空 cout << "空" << endl;else cout << "非空" << endl;s.push(1);//入栈s.p...原创 2019-10-19 17:10:28 · 181 阅读 · 0 评论 -
C++ STL deque类
deque类概念:1.是双端队列,双端队列是动态大小的序列式容器,其可以向两端进行伸缩。2.特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。3.,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高 效。与vector不同的是,deque不能保...原创 2019-10-18 13:59:17 · 177 阅读 · 0 评论 -
C++ STL list类
list类概念:1.list底层是**带头节点双向循环链表**。2. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代已让其更简单高效。3. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。 4. list是可以在常数范围内在任意位置进行插入和删除的序列式容...原创 2019-10-17 00:08:31 · 173 阅读 · 0 评论 -
C++ 函数重载 &引用
一、函数重载1、函数重载:必须在相同的作用域,函数名字必须相同,参数列表(个数、类型、类型次序)不同如果两个函数仅仅是返回值类型不同,不能构成重载。int Add(int left, int right){return left + right;}double Add(double left, double right){return left + right;}编译器在编...原创 2019-09-07 13:31:47 · 368 阅读 · 0 评论 -
C++内联函数&auto关键字
一、内联函数1、以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。2、特性:(1、) inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。(2、) inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环...原创 2019-09-08 15:04:21 · 327 阅读 · 0 评论 -
C++ 类与对象
一、类1、类与对象的初步认识:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2、类的引入:在C++中,结构体内不仅可以定义变量,也可以定义函数。 在C++中更喜欢用class来代替 。3、类的定义class studentname{//有成员函数和成员变量...原创 2019-09-15 15:25:54 · 103 阅读 · 0 评论 -
C++ 构造函数&析构函数
一、构造函数1、构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数的特征:(1)函数名与类名相同。(2)无返回值。(3)对象实例化时编译器自动调用对应的构造函数。(4)构造函数可以重载。 class Date { public: Date()//无参构造...原创 2019-09-17 16:05:38 · 181 阅读 · 0 评论 -
C++ 赋值运算符重载 & const成员
一、赋值运算符的重载1、运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字:关键字operator后面接需要重载的运算符符号。函数原型: operator+操作符(const 类类型名& d);注意:(1)不能通过连接其他符号来创建新的操作符:比如op...原创 2019-09-17 19:08:37 · 686 阅读 · 0 评论 -
C++ 构造函数的初始化列表&友元&static成员&内部类
一、构造函数的初始化列表构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。初始化列表初始化列表:以一个冒号开头:每个成员变量后面跟着一个放置在括号里的初始值,用逗号分隔开成员变量。class Date{ public: Date(int year,int month,int day) :_year(y...原创 2019-09-19 19:12:21 · 306 阅读 · 0 评论 -
C++ 内存管理&内存泄露
内存管理C/C++中程序内存区域划分:栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。C++内存管理方式一、通过new和delete来...原创 2019-09-22 15:47:30 · 148 阅读 · 0 评论 -
C++ 模板的初步理解
模板1、泛型编程编写与类型无关的通用代码,是代码代码复用的手段。模板是泛型编程的基础。int Add(int left,int right){ return left+right;}double Add(double left,double right){ return left+right;}char Add(char left,char right){ return ...原创 2019-09-23 00:02:14 · 236 阅读 · 0 评论 -
C++ STL string类
string类string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;不能操作多字节或者变长字符的序列。使用string类时,必须包...原创 2019-09-26 00:35:26 · 159 阅读 · 0 评论 -
C++ STL vector类
vector类的基本用法及接口vector是表示可变大小数组的序列容器,vector中的大部分接口和string类的接口相似,以下介绍的是vector类的重点接口1.vector 类对构造的结构vector ()无参构造vector <int> v;构造并初始化n个valvector(size_type n, const value_type);拷贝构造vector...原创 2019-10-10 00:19:09 · 131 阅读 · 0 评论 -
入门C++
一、什么是C++C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。二、C++的关键词三、命名空间在C/C++中,变量、函数和后面要学到的类都是...原创 2019-09-05 17:34:39 · 208 阅读 · 0 评论