一边看书一边刷题
1. 赋值运算符函数
类型CMyString,添加一个赋值运算符函数。
1 | class CMyString |
- 返回值
str1=str2=str3(为了连续赋值的可能性)
将返回值设置为该类型的引用
1 | return *this; |
- 传入参数
常量引用,如果传入的不是引用而是实例的话,那么从形参到实参,就会多调用一次拷贝构造函数,降低效率。
- 释放内存
防止内存泄漏。
- 细节
要判断传入的参数与赋值的是不是同一个,这样如果释放内存的话,就会导致传入的参数也被释放了。
1 | CMyString& CMyString::Operator=(const CMyString& cMyString){ |
1 | CMyString& CMyString::Operator=(const CMyString& cMyString){ |
- 把一个CMyString的实例赋值给另一个实例。
- 把一个CMyString的实例赋值给它自己。
- 连续赋值。
2. C# 单例模式
3. 数组
sizeof
int类型,一个占4字节。int a[]={1,2,3,4,5}, 则sizeof(a) = 20。
对指针int* p = a, 则sizeof(p) = 4。
当数组通过函数的参数进行传递时,数组就自动退化为同类型的指针。因此对于函数中的数组参数sizeof,结果也是4。
数组中重复元素
n个整数,a[i]∈[0,n-1],a中有重复的数字,也不知道重复了几次,有几个数字重复,求所有的重复数字。
- a[5] = 3, 则另a[3] = n+a[3],判断a[3] 是否>2n,如果大于2n,说明已重复;
- a[1] = 3,a[3]=2,a[8]=1,则另a[1]与a[3]交换,再a[1]与a[8]换,直到a[i]=i,如果在交换的过程中发现,a[i]已经等于i了,那么i重复了。
上述,时间复杂度为O(n),空间复杂度O(1)。
如果不能修改数组呢?
二分(需要自己写一下)
长度为8的数组{2,3,5,4,3,2,6,7},从中间数字4,分为1-4,5-7,那么先判断1~4的数字一共出现了几次,不难发现是5次,那么一定有重复的数字……
这种方法不可保证能找到所有重复的数字。
二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增,每一列从上到下递增。
输入这样的二维数组,判断该数组中是否含有某一整数。
思路:从右上角判断,剔除一列、一行,缩小范围。
1 | class Solution { |
4. 字符串
比较
1 | char s1[]="hello"; |
替换空格
将字符串中每个空格替换成”%20”
思考:提前申请空间。
1 | class Solution { |
5. 链表
6. 树
二叉树
先序遍历、中序遍历、后序遍历、层次遍历
重建二叉树
输入二叉树的前序、中序遍历的结果,重建该二叉树。假设输入的遍历结果中都不含重复的数字。
思路:先序中取得根节点,在中序中查找根节点,左边的是左子树,右边的是右子树,递归。
1 | /** |
二叉树的下一个节点
给定一棵二叉树和其中一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了两个左右子树的指针,还有一个父节点指针。
讲一下思路,这里的思路就是分类讨论:
类型 | 做法 |
---|---|
存在右子节点 | 找到右子节点的最左节点 |
不存在右子节点,是父节点的左子节点 | 父节点 |
不存在右子节点,是父节点的右子节点 | 向上寻找,直到找到一个点是父节点的左子节点 |
中序遍历二叉树(递归与非递归)
1 | /** |
二叉搜索树
O(logn)
堆
红黑树
把树中的节点定义为红、黑两种颜色,并通过规则确保从根节点到叶子节点的最长路径的长度不超过最短路径的两倍。
在C++的STL中,set、multiset、map、multimap等数据结构都是基于红黑树实现的。
7. 栈和队列
用两个栈实现队列
1 | 略 |
求斐波那契数列n项
1 | class Solution { |
$$ {矩阵快速幂}
\begin{bmatrix}f(n) & f(n-1) \ f(n-1) & f(n-2)\ \end{bmatrix}
=
\begin{bmatrix}1 & 1 \ 1 & 0 \end{bmatrix}^{n-1}
$$
8. 查找和排序
二分查找
1 | // 求非降序范围内第一个不小于value的位置 |
旋转数组的最小数
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
1 | class Solution { |
快速排序
1 |
交换数字
1 | // 只能对int 和 char |