- 博客(31)
- 收藏
- 关注
原创 快速排序小结
一.hoare划分法 根据基准值,将数组划分成前后两部分,前面的部分值小于基准值,后面的值大于基准值。先从后往前找到第一个小于基准值的元素,然后从前向后找到第一个大于基准值的元素,交换这两个元素。如此进行下去,用start和end标记起始位置和结束位置,在遍历的时候更新start和end。划分结束之后start和end相等,都指向最后一个小于等于基准值的元素。因此最后一步需要将基准值和该元素交换,则完成了一次划分。 二.挖坑划分法 先保存基准值,从后往前找第一个小于基准值的元素,将其直接放入原先start处
2020-08-11 21:35:53
185
原创 智能指针
一.auto_ptr auto_ptr是一个泛型类,可以管理堆上的数据。在构造函数中获取资源,在析构函数中自动释放资源。同时重载了"*”运算符,以访问其数据。当auto_ptr发生了拷贝的时候会出现管理权转移的情况。在发生对象拷贝的时候,会将原对象的指针置为空,将新对象指向原有对象指向的空间。此后旧对象不能做解引用操作,否则会导致解引用异常。因此auto_ptr通常是禁用的。 使用和实现: template<class T> class SmartPtr { private: T* _ptr;
2020-07-28 20:41:12
168
原创 手套
一.题目描述 在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。 二.题目分析 ...
2020-07-25 22:37:11
193
原创 排序旋转数组的最小值
一.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 二.题目分析 题目在原先已经排序的数组基础上做了旋转操作,将原先排在数组前面的数字旋转到了数组的后面。这些被旋转到数组末尾的数字之前是排在数组的前面且是非递减的。因此旋转到末尾的部分也是非递减排列的且这些数字均不大于没
2020-07-20 17:52:46
176
原创 前k个高频词
题目描述: 给出一个单词序列,要求获取到前k个出现次数最多的单词。若出现的次数一样,则单词的字典序靠前的单词位置也靠前。相当于以出现次数为主关键字,单词的字典序为次关键字给单词序列排序,然后返回前k个单词。例如单词序列为:"li", "yang", "zhao","li","zhao","zhang"。这个序列的前3个单词为"li","zhao", "yang"。其中"li"和"zhao‘’出现的次数相同,但是"li"的字典序靠前,因此"li"排在第一位。 大致思路:可以先统计map统计出每个单
2020-07-10 22:08:31
281
原创 将二叉搜索树转换成排序的双向链表
二叉搜索树的中序遍历得到的是一个已排序的序列。因此可以仿照中序遍历,依次访问结点并改变结点的指向,使其构成一个双向链表。在访问当前结点之前,需要先访问左子树,并改变左子树中的结点指向,使其构成双向链表。同时需要获取左子树构成双向链表的头和尾结点。头结点是整棵树构成的双向链表的头结点,而尾结点是左子树中最后一个访问的结点,用于和根结点连接。然后访问右子树,获取右子树链表的头结点和尾结点,头结点用于连接当前结点和右子树链表。所以执行的逻辑是: 1.若根节点为空,直接返回 2.根节点不为空,且左子树存在,先访问左
2020-07-10 12:49:43
343
原创 C++多态
一.构成多态的条件 1.继承 2.在父类中定义了虚函数,且在子类中完成了对该函数的重写 3.通过子类的指针或者引用调用该虚函数 其中虚函数为被关键字virtual修饰的函数,其格式为:virtual 返回值类型 函数名(形参列表){函数体} 二.重写与同名隐藏 1.同名隐藏 同名隐藏是指在子类中定义了和父类中同名的变量或者函数,其中函数只要函数名相同,不论函数的返回值和形参列表是否相同。此时父类中同名的函数被隐藏,若需要调用父类中同名的函数需要加上父类的作用域。 2.函数重写 只针对虚函数而言。不仅要求函数
2020-06-30 20:52:47
123
原创 继承
一.继承的概念和语法格式 继承主要是为了复用类的代码,并且可以在原先的类的基础上进行扩展。 语法格式: class 子类 : 继承方式 父类 {}; 二.继承方式 继承方式有public、private、protected三种。其中struct 定义的子类默认的继承方式为pubilc,class定义的子类默认的继承方式为private,这和其定义的类中的默认成员访问权限是一致的。子类继承父类之后,父类中的成员的访问权限是由父类中成员的访问权限和继承方式共同决定的。 对于父类中的private成员,在三种继承
2020-06-29 11:45:58
160
原创 string
一.string类的常用接口 1.构造 创建string类对象时,内容可以为空、可以用字符串、n个字符、或者一个string对象。 string str; string str2("123"); string str3(str2); 2.关于容量的操作 size:求字符串的长度(遇到‘\0’结束,类似于strlen的结果) capacity:字符串空间大小 empty:是否为空串(size为0) clear:清空字符串(只是将size改成0) resize:调整有效字符的个数 可以增大也可以减少字符
2020-06-18 21:46:33
252
原创 stack、queue、和priority_queue
一. stack stack是“先入后出”的容器适配器,可以由其支持empty、back、push_back、pop_back、等操作的容器来实现。比如list、vector、deque来。默认的实现方式是用deque。原因是相比与vector,deque的增容代价较低,list容易造成内存碎片且空间利用率低。 二.queue “先进先出”的容器适配器,可以由支持emtpy、size、front、back、push_back、pop_front等操作的容器来实现。比如deque、list。默认实现方式为de
2020-06-17 19:49:10
166
原创 模板初阶
一.模板的概念 为了对不同数据类型实现某些同样的操作,可以通过重载函数来完成。但是重载函数的代码复用率和可维护性比较低,在开发过程中书写高度雷同的代码也是一份苦差事。而模板解决了这样的弊端,只用编写一份与类型无关的通用代码,提高了代码的复用率和开发效率。 二.函数模板 格式 : template<class T1, class T2,…> 返回值类型 函数名(参数列表){} template<class T> T Add(const T & a, const T& b
2020-06-04 10:48:05
143
原创 类和对象1
1 访问权限 用public修饰的成员可以在类外访问,用private和protected修饰的成员在类外不能访问。 class与struct的区别 :class中的默认访问权限是private,struct中的成员的默认访问权限是public。 2 计算类对象的大小 类的大小只包含成员变量的大小,而不包括成员函数,成员函数放在公共的代码区。 计算时遵循内存对齐规则: 1)第一个成员的偏移量为0 2)其他成员都有一个对应的对齐数,且存储的时候要对齐到对齐数的整数倍上,其中对齐数是 编译器的对齐数 和该变量成
2020-05-24 15:26:49
153
原创 C++名空间、函数重载、引用
1.命名空间 1.1 命名空间的定义 为了解决函数、变量重名导致的命名冲突,给变量定义一个作用域来区分同名的变量。 命名空间的定义:namespace 命名空间名 { 成员 } 命名空间的定义可以嵌套和分段。 1.2 命名空间的使用 (1)使用变量的时候在变量名添加 空间名:: (2)用using将命名空间成员引入 using 命名空间名::成员名 (3)将整个命名空间引入 using 命名空间名; 将空间的变量引入相当于声明以下使用的变量来自于该空间,若存在同名的全局变量,则会编译报错。 2 缺省参
2020-05-22 14:58:31
187
原创 栈和队列
栈和队列是特殊的线性表。均可用顺序表和链表来实现。 1.栈 核心操作时入栈和出栈,且都只能在同一端进行。数据的入栈顺序和出栈顺序相反,遵循“后进先出”的原则。除了入栈和出栈外还有判空、取栈顶元素、栈的初始化、销毁等接口。 栈的实现: 1.链表 栈只能在一端进行操作,因此可以用单链表的头插和头删来实现栈的入栈和出栈操作。时间复杂度均为O(1) 2.顺序表 也可以用顺序表的尾插和尾删来...
2020-04-11 19:34:38
124
原创 动态内存管理
为了更加灵活的确定申请空间的大小(空间较大),使用动态内存函数动态开辟内存空间。 一.动态内存函数 1.malloc 函数原型为voidmalloc(size_t size) 在堆区申请size个字节的空间,返回起始地址。size为0是未定义行为。 2.calloc void calloc(size_t num,siz_t size) 同malloc功能一样,在堆区中申请num * size个字节...
2020-03-20 17:40:10
289
原创 字符串与内存函数
1.strcat 字符串连接函数,类似于字符串的+= char* Strcat(char* dest, const char* src) { if (dest == NULL || src == NULL) { return NULL; } char* tmp = dest; while (*tmp) { tmp++; } int n = 0; while (*(src + ...
2020-03-13 21:13:43
136
原创 几道指针面试题
int a[5] = { 1, 2, 3, 4, 5 }; int* ptr = (int*)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1)); // 2 5 在*(a + 1)中a被隐式转成指向首元素1的指针,加1再解引用得到第二个元素2;&a得到一个int()[5],值为1的地址,加1跳过整个数组,值为5的地址加1,...
2020-03-09 13:15:53
213
原创 strlen与sizeof
1.strlen strlen的功能为计算字符串的长度,其函数声明为 size_t strlen(const char*);功能为计算字符串的长度,不包含‘\0’,’\0’是字符串的结束标志,而不是字符串的内容。 当调用strlen的实参的类型不是char类型,是char,int,char**,char (*)[n]或者字符数组等类型时,属于未定义行为,结果未知。由于C语言是弱类型语言,在...
2020-03-08 11:32:29
141
原创 数据在内存中的存储
1.大端序和小端序 数据在内存中存储的字节顺序不同,其中大端序是符合平时的习惯,将数据的高字节部分存储于低地址,将低字节部分存储于高地址中.如0x11223344在内存中的实际存储情况是从某个地址开始为:11 22 33 44.而小端序则相反. 如何判断是大端序存储还是小端序存储? 可以根据大小端序存储的区别,将一个实际数据存入内存中,如a = 0x11223344,通过查看在内存中变量a起始...
2020-02-26 13:26:34
195
原创 指针
1.什么是指针 指针是内存的地址,指针变量是指变量的内容是某个类型在内存中的地址。因此指针包括指针的值和指针的类型两层含义。指针的类型描述了指针所能间接访问内存空间的大小。在32为系统上指针变量占4个字节,在64位系统上占8个字节。 2.void 和空指针 void * 是指 指针变量的类型不定,它可以对应内存中任意大小的空间。可以把其他类型的指针赋给void,在某些情况(如memset...
2019-12-09 10:40:00
146
原创 确定比赛名次、找出凶手、打印杨辉三角
1 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> /* **项目功能: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第二,我第三; b2a3 B选手说:我第二,E第四; b2e4 C选手说:我第一,D...
2019-11-30 18:28:55
112
原创 扫雷游戏
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> /* **完成时间2019年11月26日 */ #define MAX_ROW 9 #define MAX_COL 9 #define...
2019-11-27 22:05:44
114
原创 三子棋
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define MAX_ROW 3 #define MAX_COL 3 int Menu() { printf("--------...
2019-11-27 20:37:02
87
原创 递归相关简单习题
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> /* **项目名称:递归实现打印整数的每一位 **完成时间:2019年11月19日 */ void Print_digit(int n) { if (n > 10) { Print_digit(n / 10);...
2019-11-19 20:54:52
244
原创 数组的初始化、清空、逆置
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> /* 项目名称:数组的初始化、清空、逆置 项目功能:编写函数实现对数组的初始化、清空、逆置 完成时间:2019年11月17日 */ void Clear_arr(int * a, ...
2019-11-17 22:33:36
172
原创 猜数字游戏、折半查找、三次输入密码、单字符转换后输出
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> /* **项目名称:猜数字游戏 **项目功能:随机生成一个1-100的整数,从键盘键入一个数字,根据提示继续输入,直至猜中为止。 **完成时间:2019年11月11日 */ vo...
2019-11-12 11:52:14
173
原创 安装git和注册github账号
1.下载并安装git for windows(一路next即可) 2.下载并安装tortoise git(使用默认结果即可) 3.设置tortoise git姓名和邮箱 4.重启电脑 5.登陆github网址https://github.com/注册账户 6.创建一个项目仓库 ...
2019-11-09 16:59:04
272
1
原创 输出星号、求水仙花数、前五项和
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> /* **项目名称:按样式输出星号 **完成时间:2019年11月9日 */ void Star(int n) { for (int i = 0; i < n; i++) { printf("%c", '*');...
2019-11-09 16:47:04
222
原创 交换两个数组、求前n项的和
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #define Tar 9 #define Max 100 /* **项目名称:统计9的个数 **项目功能:统计1-100整数中9出现的次数 **完成时间:2019年11月6日 */ int Count(int m ,in...
2019-11-06 15:31:46
128
原创 交换两个数、最大公约数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> /* **项目名称:交换两个整型变量的值 **完成时间:2019年11月4日 */ int main() { int a, b, c; printf("请输入两个整数:\n"); scanf("%d%d",&...
2019-11-04 10:47:18
103
原创 闰年、素数、乘法表
1.判断1000-2000间的闰年 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> /* **项目名称:判断1000-2000年间的闰年 **项目功能:- **完成时间:2019年11月3日 */ int Judge_leap_year(int year) { if (yea...
2019-11-03 10:32:02
153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人