基础知识
赋值运算符函数
知识点:
(1)类的成员函数可以直接访问作为其参数的同类型对象的私有成员。
(2) 一个类关键的函数包括 构造函数 拷贝构造 析构函数 运算符重载(=赋值重载)
(3) 在=赋值重载函数中 需要注意 返回值是引用 可以作为参数接着传递 以此实现多次赋值;需要判断传入参数是否是this
若是this 一旦释放内存 传入参数内存也会丢失 找不回需要赋值的内容了
1 | class MyString |
实现单例模式
在多线程环境下只存在一个实例
1 | Class Singleton |
模板化后写法
1 | template <class T> |
二维数组的查找
分析 查找时出现的三种情况 即可得到答案
1 | bool find(int* matrix, int rows, int columns, int number) |
替换空格
从尾部开始替换1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36void replace_blank(char str[], int length)
{
if(str==nullptr || length<=0)
return ;
int origin_length = 0;
int blank_length = 0;
int i = 0;
while(str[i]!='\0')
{
++origin_length;
if(str[i]==' ')
++blank_length;
++i;
}
int total = origin_length + blank_length*2;
if(total > length)
return;
int index_origin = origin_length;
int index_new = total;
while(index_origin>=0 && index_new>index_origin)
{
if(str[index_origin]==' ')
{
str[index_new--] = '0';
str[index_new--] = '2';
str[index_new--] = '%';
}else{
str[index_new--] = str[index_origin];
}
--index_origin;
}
}
从头到尾打印链表
使用栈或递归1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20void print_listnode_reverse(ListNode *phead)
{
stack<ListNode*> nodes;
ListNode* node = phead;
while(node!=nullptr)
{
nodes.push(node);
node = node->next;
}
while(!nodes.empty())
{
node = nodes.top();
cout<<node->key<<endl;
nodes.pop();
}
}
重建二叉树
用两个站实现队列
旋转数组的最小数字
斐波那契数列
计算1出现的次数
第八章 新增试题
滑动窗口的最大值
使用双向队列 该队列保存当前滑动窗口的最大值 下一个数进来时
与当前值进行判断 大于 删除当前值 还需判断最大值是否在活动窗口内
矩阵中的路径
回溯法 判断当前节点的四周节点的数据与下一个数据是否相同 不同恢复原来状态。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56bool hasPathCore(char* matrix, int row, int col, int rows, int cols, char* str, bool *visited, int& length)
{
cout<<"len"<<length<<" "<<row<<" "<<col<<endl;
if(str[length] == '\0')
return true;
bool hasPath = false;
if(row>=0 && row<rows && col>=0 && col<cols
&& matrix[row*cols+col] == str[length] && !visited[row*cols+col])
{
visited[row*cols+col] = true;
cout<<"len"<<length<<" "<<matrix[row*cols+col]<<endl;
++length;
cout<<length<<endl;
hasPath = hasPathCore(matrix, row, col-1, rows, cols, str, visited, length)
|| hasPathCore(matrix, row-1, col, rows, cols, str, visited, length)
|| hasPathCore(matrix, row, col+1, rows, cols, str, visited, length)
|| hasPathCore(matrix, row+1, col, rows, cols, str, visited, length);
if(!hasPath)
{
--length;
visited[row*cols+col] = false;
}
}
return hasPath;
}
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if(matrix == nullptr || rows<1 || cols<1 || str==nullptr)
return false;
bool *visited = new bool[rows*cols];
int length = 0;
memset(visited, 0, rows*cols);
for(int i=0;i<rows;++i)
{
for(int j=0;j<cols;++j)
{
//hasPathCore(matrix, i,j,rows,cols, str,visited,length);
if(hasPathCore(matrix, i,j,rows,cols, str,visited,length))
{
return true;
}
}
}
delete []visited;
return false;
}
机器人的运动范围
1 | // 67 robot moving |