文章初心
- 笔者是应届生,现在的面试都不仅是核心代码模式,很多公司开始考察ACM模式,而在leetcode刷题时,都是核心代码模式,我相信很多同学像我一样,就没怎么接触过ACM模式,假如没接触ACM模式,面试中,很可能惊慌失措,接下来我将简单的介绍一下在编译器编译代码。
头文件
ACM模式首先就是自己写头文件,以下是经常要用到的头文件。
-
#include< cstdio >
在C++中拥有在C语言里一样的语法,像输入输出。 -
#include< cstring >
包含很多字符串函数,如复制、比较是否相等、字符串连接。 -
#include< iostream >
输入输出流,包括输出格式的控制 -
#include< cstdlib >
在C++中拥有在C语言里一样的语法,像开辟空间释放空间函数calloc、malloc,realloc和free;随机数rand。 -
#include< bitset >
相当于一个多位二进制数,八位一字节,支持基本的位运算操作。 -
#include< cmath >
数学函数,和C语言一样,有绝对值函数、开平方函数、求幂方函数等等。 -
#include< algorithm >
算法头文件,包括很多常用函数,像find_if、for_each、sort、partial_sort。 -
#include< string >
stl容器,有初始化、拼接、赋值、查找、替换、比较、子串、插入和删除操作。 -
#include< vector >
stl容器,动态数组(可变数组),也叫单口容器,有初始化、常用赋值操作、存取、插入、删除、大小操作。 -
#include< stack >
栈容器,先进后出,栈不能遍历,不支持随机存取,只能通过top从栈顶获取和删除元素,不提供迭代器。常用API有构造函数,赋值操作,数据存取操作和大小操作。 -
#include< list >
链表容器
链表是由一系列的结点组成,结点包含两个域,一个数据域,一个指针域。
链表内存是非连续的,添加删除元素,时间复杂度都是常数项,不需要移动元素,比数组添加删除效率高。链表只有在需要的时候才分配内存。链表 只要拿到第一个结点,相当于拿到整个链表。链表需要额外的空间保存结点关系 前驱后继。常用API有构造函数,数据元素插入删除操作,大小操作,赋值操作,数据存取和反转排列顺序。 -
#include< deque >
双口容器,支持随机存取。所谓双向开口,意思就是可以在头尾两端分别做元素的插入和删除操作。双端插入和删除元素效率高。指定位置插入也会导致数据元素移动,降低效率。可随机存取,效率高.。常用API有构造函数,赋值操作,大小操作,双端插入删除操作,数据存取。 -
#include< set >
二叉树容器
所有元素会根据元素的值自动进行排序。set是以RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好。set容器中不允许重复元素,multiset允许重复元素。常用API有构造函数,赋值操作,大小操作,插入删除操作,查找操作。 -
#include< map >
map相对于set区别,map具有键值和实值,所有元素根据键值自动排序,pair的第一元素被称为键值,第二元素被称为实值,map也是以红黑树为底层实现机制的。常用API有构造函数,赋值操作,大小操作,插入删除操作,查找操作。 -
#include < bits/stdc++.h >
万能头文件,包含了目前c++所包含的所有头文件。可替换所有头文件。
main() 函数
main()函数里调用class类的调用经常出错,经过本人经验和其它博主的总结为以下:
经常用到的vector容器中
int arr[] = {1,3,-1,-3,5,3,6,7}; //先定义数组
vector<int> nums(arr, arr + sizeof(arr) / sizeof(int)); //通过数组的首地址,再定义vector
Solution solution; //创建一个类,再通过类来调用函数
举例说明
本地编译器代码
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
using namespace std;
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); i++) {
while (q.size() && q.front() <= i - k) q.pop_front(); //将窗口的最前面的元素弹出
while (q.size() && nums[q.back()] <= nums[i]) q.pop_back(); //将队列底部小于遍历的元素弹出
q.push_back(i); //插入该元素
if (i >= k - 1) res.push_back(nums[q.front()]); //将最后的元素插入到队列中
}
return res; //返回结果数组
}
};
int main () {
int k = 3;
int arr[] = {1,3,-1,-3,5,3,6,7};
vector<int> nums(arr, arr + sizeof(arr) / sizeof(int));
Solution solution;
vector<int> res = solution.maxSlidingWindow(nums, k); //将vector<int> 写成int,初始化类型错误,导致编译出错
for (int i = 0; i < res.size(); i++) {
cout<<res[i]<<" ";
}
return 0;
}
Dev-C++返回结果
总结
笔者在main()函数里,将vector 写成int,初始化类型错误,导致编译出错 ,一开始还以为自己后面的参数传错了, 没想到的是最前面的定义返回值类型定义错误,导致花了很久时间才找到错误,值得注意的是,以后我们写代码的时候,一定不要着急,先检查定义数据类型,再看参数类型,谢谢大家的观看。