
C++
canvass
Practice makes perfect
展开
-
菱形继承和虚继承
一、单继承和多继承单继承:一个子类只有一个直接父类时,称这个继承为单继承。 多继承:一个子类有俩个或以上的直接父类时称这个继承关系为多继承。单继承:可以有多个父类,但是只能由一个直接父类。示意图如下:多继承示意图如下:菱形继承示意图如下:菱形继承对象模型:Assistant的对象中有两份Person成员,菱形继承存在数据冗余和二义性的问题。菱形继承举例:class person{public: string _name;}; class studen原创 2020-08-28 18:28:09 · 448 阅读 · 0 评论 -
C++ sizeof关键字总结
1. 定义sizeof是一个操作符(operator)。其作用是返回一个对象或类型所占的内存字节数,其返回值类型为size_t。(size_t在头文件stddef.h中定义,它依赖于编译系统的值,一般定义为 typedef unsigned int size_t;)2. 语法sizeof有三种语法形式:sizeof (object); //sizeof (对象)sizeof object; //sizeof 对象sizeof (type_name); //s原创 2020-08-27 16:35:32 · 217 阅读 · 0 评论 -
static关键字总结
1. C 语言的 static 关键字有三种(具体来说是两种)用途:a. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。int foo(){ static int i = 1; // note:1 //int i = 1; // note:2 i += 1; return i;}我们首先要了解c/c++的内存分布,以及static所在的区间。对于一个完整的程序,在内存中的分布情况如下: 栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区.原创 2020-08-27 15:53:57 · 140 阅读 · 0 评论 -
C++ const 关键字总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。1. const的作用1.可以定义const常量。const int Max = 100;2.便于进行类型检查。const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类...原创 2020-08-27 10:26:55 · 135 阅读 · 0 评论 -
蘑菇阵
题目解析该题类似于走迷宫,蘑菇代表不能走通,但不同的是,迷宫可以向前后左右四个方向移动,但该题走的方式只能向右或者向下两个方向移动,注意:右边界处只能向一个方向移动,因此走不通路径的概率是不相等的。比如:M = 2 N = 3 1 2 3 4 5 6 在1时:既可向右走到2,也可向下走到4,因此从1-->2 和从1-->4的概率均为0.5 在2时:即可向右走到3,也可向下走到5,因此从2-->3和从2-->5的概率均为0.5 在3时:只能走到6,因此从3-->..原创 2020-07-14 10:53:21 · 273 阅读 · 0 评论 -
求正数数组的最小不可组成和 (动态规划:01背包问题)
一、解决问题1、题目描述2、题目解析 动态规划:01背包问题(无物品价值),思想相同,题目最终要求有些变化。min为最轻物品的重量,sum为所有物品总重量。假设有一个能装入容量为C(C在[min,sum]间取值)的背包和n件重量分别为w1,w2,…,wn的物品,能否从n件物品中挑选若干件恰好装满背包,要求输出不满足条件的最小容量。 该题要求数组的最小不可组成和,例如arr = {3,2,5} arr的min为2,max为10,在区间[2,10]上,4是不能被任何一个子集相加得到的值...原创 2020-07-03 17:23:02 · 509 阅读 · 0 评论 -
红黑树
红黑树:搜索二叉树,节点中加了颜色,不是红色就是黑色,树中最长路径不超过最短路径的2倍。AVL树是严格平衡的二叉搜索树,红黑树是近似平衡二叉树。红黑树的性质总结:1、根是黑的;2、没有连续的红节点;3、每条路径都有相同数量的黑节点。为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的2倍? 答:最短路径:全黑,最长路径:一黑一红,所以最多是2倍。插入case1:cur为红,p为红,g为黑,u存在且为红.----> p和u变红,g变红。..原创 2020-06-24 18:08:35 · 245 阅读 · 0 评论 -
用一种思路实现二叉树的非递归前序/中序/后续遍历
非递归遍历前序/中序/后续思路一样,只不过是访问根节点的时机不同!!!1、前序非递归前序遍历:1 2 4 5 3 6 7 根 左子树 右子树非递归(迭代)访问一棵树访问左路节点并入栈; 访问左路节点的右子树(将右子树分成左路节点和右树来访问)class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> ret; ...原创 2020-06-16 16:36:39 · 145 阅读 · 0 评论 -
模拟实现vector
#pragma once#include<assert.h>namespace ywt{ template<class T> class vector { public: typedef T* iterator; typedef const T* const_iterator; vector() :_start(nullptr) , _finish(nullptr) , _endofstorage(nullptr) {} /.原创 2020-05-21 16:02:26 · 158 阅读 · 0 评论 -
只出现一次的数字
1、解题思路:异或:相同为0,不同为1。异或同一个数两次,原数不变。class Solution {public: int singleNumber(vector<int>& nums) { int value=0; for(auto e: nums){ value ^= e; } return value; }};2、解题思路:考虑数字的二进制形式-->.原创 2020-05-19 18:55:59 · 330 阅读 · 0 评论 -
验证回文串
思路:只保存字母数字; 全部转化为大写字母; 判断是否是回文(比较 s[begin] 与s[end] 是否相等)。 class Solution {public: bool isLetterOrNumber(char ch) { return (ch>='a' && ch<='z') || (ch>='A' &...原创 2020-05-07 17:48:21 · 139 阅读 · 0 评论 -
string
string类string是表示字符串的字符串类; 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作; string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string; 不能操作多字节或者变长字符的序列。 在使用string...原创 2020-05-06 10:50:45 · 116 阅读 · 0 评论 -
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路题目要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句A?B:C,说明不能采用常规方法进行累加求和; 充分利用C++特性,构造对象时构造函数会自动调用的特点,让求和在构造函数中进行完成; 由于所有对象要针对相同的和进行更新,所以其成员定义为static。 class Solution {public: class Sum ...原创 2020-05-05 09:10:09 · 210 阅读 · 0 评论 -
实现日期类
#include<iostream>using namespace std;class Date{public: int GetMonthDay(int year, int month) { static int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //是2...原创 2020-05-02 21:43:07 · 169 阅读 · 0 评论 -
模板
写一些函数和类的时候,针对不同类型需要写很多重复的代码。 函数:比如我们想要实现交换int,double,char等各种类型对象函数swap; 类:比如我们想要实现一个数据结构栈stack,stack的多个对象 st1存储int,st2存储double等。 在没有模板之前,我们需要针对各个类型写相对应的多个swap函数和stack类,而这些函数和类,逻辑是一样...原创 2020-04-28 19:31:55 · 165 阅读 · 0 评论 -
set&&map
1. 关联式容器 set map红黑树set:set <容器类型, 校验规则>set:1. 自动排序2. 自动去重3. 不能用中括号insert:可以插入单个值,返回值:pair<iterator, bool>erase:可以直接删除某个值count:可以检查某个值是否存在multiset:与set的不同:1. 不会去重,允许同样的...原创 2019-11-19 21:54:57 · 112 阅读 · 0 评论 -
线索二叉树的插入与删除
#pragma oncenamespace Y{ template <class T> class TreeNode { T m_data; TreeNode<T> * m_left; TreeNode<T> * m_right; public: TreeNode(const T & val = T()) : m_d...原创 2019-11-18 23:15:29 · 2473 阅读 · 0 评论 -
最小步数Fibonacci数列
题目描述:Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X...原创 2019-11-14 11:26:37 · 410 阅读 · 0 评论 -
合并果子
题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定...原创 2019-11-13 23:10:29 · 155 阅读 · 0 评论 -
前K个高频单词
题目:给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出: ["i", "love"]解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。注...原创 2019-11-13 23:00:07 · 189 阅读 · 0 评论 -
网格问题
题目描述:二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1,每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根,小易想知道最多可以放多少块蛋糕在网格盒子里。输入描述:每组数组包含网格长宽...原创 2019-11-12 16:02:20 · 374 阅读 · 0 评论 -
练习元素查找
有一个排过序的数组,包含n个整数,但是这个数组向左进行了一定长度的移位,例如,原数组为[1,2,3,4,5,6],向左移位5个位置即变成了[6,1,2,3,4,5],现在对于移位后的数组,需要查找某个元素的位置。请设计一个复杂度为log级别的算法完成这个任务。给定一个int数组A,为移位后的数组,同时给定数组大小n和需要查找的元素的值x,请返回x的位置(位置从零开始)。保证数组中元素互异。...原创 2019-11-10 22:23:54 · 144 阅读 · 0 评论 -
输入一个字符串,求出该字符串包含的字符集合
输入描述:每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。输出描述:每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。示例:输入abcqweracb 输出abcqwer#include<iostream>#include<string>using namespace s...原创 2019-11-10 21:57:57 · 535 阅读 · 0 评论 -
找出数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题方法1先给数组排序,排完序的数组如果存在一个数字出现的次数超过数组长度的一半,则它必定在数组中间位置解题方法2数组中有一个数字出现的次数超过数组长度的一半,也就...原创 2019-11-09 22:25:13 · 427 阅读 · 0 评论 -
读入一个字符串str,输出字符串str中的连续最长的数字串
读入一个字符串str,输出字符串str中的连续最长的数字串输入描述:测试输入包含1个测试用例,一个字符串str,长度不超过255。输出描述:在一行内输出str中里连续最长的数字串。输入例子: abcd12345ed125ss123456789输出例子:123456789解题思路首先遍历字符串,找到连续的数字串 把这一部分数字串遍历完后,记录数字串长度,继续往后遍...原创 2019-11-09 21:42:08 · 683 阅读 · 0 评论 -
复习:输入两个字符串,从第一个字符串中删除第二个字符串中所有的字符
例如,输入“ They are students.” 和 “aeiou”, 则删除之后的第一个字符串变为“Thy r stdnts.”解题思路:对于字符串,由于ASCII码的所有符号为256个(包括了拓展表)那么,我们可以申请一个数组用来代表这256个字符是否存在于第二个字符串中,如果有,则标记为1,如果没有则标记为0.同理,我们通过查询,对应ASCII值号下,数组是否为1,来判定是否删除。...原创 2019-11-06 17:30:30 · 1993 阅读 · 0 评论 -
贪心算法例题
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。例如:一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2为了让比...原创 2019-11-06 16:41:38 · 192 阅读 · 0 评论 -
删除链表的倒数第N个节点
给定一个链表,使用一趟扫描实现, 删除链表的倒数第n个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.解题思路:假设双指针p和q,当q指向末尾的NULL,p与q之间相隔的元素个数为n时,那么删除掉p的下一...原创 2019-11-03 21:41:08 · 117 阅读 · 0 评论 -
多态
多态一、重写/覆盖虚函数:可以被重写的函数,virtual修饰当派生类继承基类后,如果基类中含有虚函数,子类可以对虚函数执行重写(覆盖),方法是写一个跟它完全相同的函数(函数名、参数列表、返回值都相同),就会覆盖掉原来的函数。覆盖后,无论用基类指针还是派生类指针,都会调用覆盖后的函数。特例:协变:假如B继承自A,D继承自C,那么A中虚函数返回了C类指针,B中虚函数返回了D...原创 2019-10-29 22:36:30 · 267 阅读 · 0 评论 -
C++思维导图
C++一共63个关键字,C语言32个关键字。缺省参数:(传参给一个默认值)放在 参数列表末尾。函数重载:(一个域)重名函数,参数列表不同。内联函数:指定调用处展开,并非调用栈,过于复杂处理成普通函数。auto关键字:自动判断变量类型,所以必须初始化。范围for:遍历有begin,end容器(迭代器)++,遍历数组。nullptr:空指针解决C语言不统一,不安全的问题。...原创 2019-10-26 21:41:39 · 624 阅读 · 0 评论 -
二叉树的层序遍历算法
实现思路:A入队->然后出队,出队时将其左右孩子入队,循环队列进行出队,每次出队将其左右孩子入队。当队列为空时,整棵树层序遍历完毕。实现过程:代码:#include<iostream>#include<vector>#include<queue>using namespace std;struct TreeNode{ ...原创 2019-10-25 22:39:08 · 899 阅读 · 0 评论 -
替换空格(将字符串中的空格替换为20%)
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为 We Are Happy.则经过替换之后的字符串为 We%20Are%20Happy。解题思路:先遍历找出空格总数,并计算出替换之后的字符串的总长度。然后从字符串的后面开始复制和替换。#include<iostream>using namespace std;void replaceBlank(...原创 2019-10-13 22:27:07 · 1110 阅读 · 0 评论 -
二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]解题思路:在访问过程中,我们只需要将同一层中的节点同时入队列即可。在将该qu...原创 2019-10-12 11:30:55 · 158 阅读 · 0 评论 -
逆波兰表达式求值
根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3) = ...原创 2019-10-12 10:08:45 · 117 阅读 · 0 评论 -
动态内存分配
一、内存区域1、堆、栈(const变量在栈里)、全局区、常量区、代码区常量区,代码区是只读段,不能改栈:系统自动分配的空间,只要不特殊声明,就定义在栈区,函数的区域也在栈上。栈是向下增长的。堆:使用动态内存分配的方式可以申请堆空间,用完要手动释放全局区:静态变量、全局变量(static)常量区:代码中的数字,字符等常量,例如 'a', -1.2等代码区:存放可执行代码,...原创 2019-09-05 23:09:13 · 182 阅读 · 0 评论 -
友元、内部类
1、友元友元就是让一个外部函数或者外部类能访问我的私有成员。友元打破了原有的权限制度,所以十分危险,不建议使用。2、内部类在另一个类内声明的类它属于外部类域中的一员,实例化对象需要使用域操作运算符(::),同时它有权限的限制。(private的类声明不能直接在外面声明对象)外部类是内部类的友元,但是内部类不是外部类的友元。int 可以变成 const, 但是cons...原创 2019-09-04 10:09:01 · 169 阅读 · 0 评论 -
类和对象3
类和对象3一、初始化列表1、狭义初始化在定义变量的时候直接进行初始化,int i=3;2,广义初始化第一次给变量赋值就叫做初始化的情况叫广义初始化int a;...//跟a无关的代码a=3;初始化列表相当于狭义初始化,而构造函数内部相当于广义初始化所以初始化列表可以解决一些只能用狭义初始化进行初始化的变量,例如:1、const变量2、引用3、没有...原创 2019-09-01 23:40:06 · 113 阅读 · 0 评论 -
类和对象2
一,构造函数1,构造函数是一个特殊的成员函数,不存在返回值,名字和类名相同,在实例化对象的时候自动调用。传什么参数调什么构造2,系统会自动提供一个默认的构造函数,如果自己实现了构造函数,则系统不再提供默认的构造函数。带参数的构造函数,按照参数来决定3,构造函数可以存在参数,它与其他的构造函数是以函数重载的方式共同存在的。4,拷贝构造 int i(6) 函数是参数为本类其他对象的...原创 2019-08-29 23:13:47 · 140 阅读 · 0 评论 -
练习 类和对象
1、声明一个扑克牌类,拥有方法:传入花色和点数生成扑克牌、打印扑克牌。2、声明一个玩家类,每人拥有18张扑克牌。拥有方法:增加手牌(摸牌)、展示手牌,其中展示手牌要求降序排序展示。完成程序:1、随机生成18张扑克牌,当做一个玩家的手牌。2、用54张不同的扑克牌构成牌堆,发给3个玩家。#include<iostream>#include<cstring>...原创 2019-08-29 22:55:18 · 170 阅读 · 0 评论 -
练习函数重载
有以下结构:struct student{char name[32];int age;int class;bool sex;};写出函数,用函数重载的方式编写程序,统计出一个以上述结构为基准的结构体数组中:1、名字为X的出现了多少次2、年龄为X的出现了多少次3、班级为X的出现了多少次4、性别的X的出现了多少次例如:名字为X的可以是这样的声明:in...原创 2019-08-29 21:52:55 · 212 阅读 · 0 评论