作为一名经历过考研复试机试的过来人,我深知数据结构与算法在计算机相关专业复试中的关键地位。机试环节往往要求在有限时间内完成多道编程题目的解答,这不仅考察基础知识的掌握程度,更考验实际编码能力和解题思维。而C++作为算法竞赛和高校机试的主流语言,其高效性和丰富的STL库使其成为应对这类场景的利器。
这个代码大全的诞生,源于我当年备战期间踩过的无数坑。市面上虽然不缺算法教程,但要么偏重理论推导缺乏代码实现,要么代码示例过于零散不成体系。特别是在高压的机试环境下,如何快速定位到所需算法的标准实现模板,并针对题目特点进行适当修改,成为决定成败的关键技能。
本代码大全采用"数据结构+算法+题型"三维分类法:
每个算法模块遵循统一模板:
cpp复制// 算法描述与复杂度分析
// 输入输出说明
// 典型应用场景提示
#include <bits/stdc++.h>
using namespace std;
// 核心实现代码
void algorithm(...) {
// 关键步骤注释
}
// 测试用例
int main() {
// 标准测试案例
// 边界条件测试
return 0;
}
特别注意:机试环境通常允许使用<bits/stdc++.h>头文件,但实际工程中应避免
cpp复制// 动态数组处理技巧
vector<int> arr;
// 预分配空间避免频繁扩容
arr.reserve(1000);
// 原地去重(需先排序)
sort(arr.begin(), arr.end());
arr.erase(unique(arr.begin(), arr.end()), arr.end());
// 二维数组定义
vector<vector<int>> matrix(m, vector<int>(n, 0));
cpp复制struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 快慢指针找中点
ListNode* findMid(ListNode* head) {
ListNode *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
cpp复制// 非递归前序遍历
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if (root) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top(); st.pop();
res.push_back(node->val);
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
}
return res;
}
cpp复制void quickSort(vector<int>& nums, int l, int r) {
if (l >= r) return;
// 三数取中法选择基准值
int mid = l + (r - l) / 2;
if (nums[l] > nums[r]) swap(nums[l], nums[r]);
if (nums[mid] > nums[r]) swap(nums[mid], nums[r]);
if (nums[l] < nums[mid]) swap(nums[l], nums[mid]);
int pivot = nums[l];
int i = l, j = r;
while (i < j) {
while (i < j && nums[j] >= pivot) j--;
nums[i] = nums[j];
while (i < j && nums[i] <= pivot) i++;
nums[j] = nums[i];
}
nums[i] = pivot;
quickSort(nums, l, i - 1);
quickSort(nums, i + 1, r);
}
cpp复制vector<int> dijkstra(vector<vector<pair<int, int>>>& graph, int start) {
int n = graph.size();
vector<int> dist(n, INT_MAX);
dist[start] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
pq.emplace(0, start);
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto [v, w] : graph[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.emplace(dist[v], v);
}
}
}
return dist;
}
cpp复制// 关闭同步流提速(慎用,会影响cin/cout与scanf/printf混用)
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 快速读取整数
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
大数取模运算:
cpp复制// 防止中间结果溢出
long long mul_mod(long long a, long long b, long long mod) {
long long res = 0;
a %= mod;
while (b) {
if (b & 1) res = (res + a) % mod;
a = (a << 1) % mod;
b >>= 1;
}
return res;
}
滑动窗口模板:
cpp复制int slidingWindow(vector<int>& nums, int k) {
int left = 0, res = 0;
unordered_map<int, int> count;
for (int right = 0; right < nums.size(); right++) {
count[nums[right]]++;
while (count.size() > k) {
if (--count[nums[left]] == 0)
count.erase(nums[left]);
left++;
}
res = max(res, right - left + 1);
}
return res;
}
段错误(Segmentation Fault)
时间限制 exceeded
内存限制 exceeded
cpp复制#ifdef DEBUG
#define debug(x) cerr << #x << " = " << x << endl
#else
#define debug(x)
#endif
// 在代码中插入调试点
debug(variable_name);
// 编译时添加-DDEBUG参数启用调试输出
cpp复制class Codec {
public:
string serialize(TreeNode* root) {
if (!root) return "#";
return to_string(root->val) + "," +
serialize(root->left) + "," +
serialize(root->right);
}
TreeNode* deserialize(string data) {
queue<string> q;
stringstream ss(data);
string item;
while (getline(ss, item, ',')) q.push(item);
return helper(q);
}
private:
TreeNode* helper(queue<string>& q) {
string val = q.front(); q.pop();
if (val == "#") return nullptr;
TreeNode* node = new TreeNode(stoi(val));
node->left = helper(q);
node->right = helper(q);
return node;
}
};
cpp复制class LRUCache {
private:
int capacity;
list<pair<int, int>> cache;
unordered_map<int, list<pair<int, int>>::iterator> map;
public:
LRUCache(int capacity) : capacity(capacity) {}
int get(int key) {
if (!map.count(key)) return -1;
auto it = map[key];
cache.splice(cache.begin(), cache, it);
return it->second;
}
void put(int key, int value) {
if (map.count(key)) {
auto it = map[key];
it->second = value;
cache.splice(cache.begin(), cache, it);
return;
}
if (cache.size() == capacity) {
map.erase(cache.back().first);
cache.pop_back();
}
cache.emplace_front(key, value);
map[key] = cache.begin();
}
};
预处理技术:
记忆化搜索:
cpp复制unordered_map<string, int> memo;
int dfs(string state) {
if (memo.count(state)) return memo[state];
// 计算过程...
return memo[state] = res;
}
位运算优化:
cpp复制// 判断是否为2的幂次
bool isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
优先队列自定义比较:
cpp复制auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second; // 小顶堆
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq(cmp);
有序集合应用:
cpp复制set<int> s;
// 查找第一个大于等于x的元素
auto it = s.lower_bound(x);
if (it != s.end()) cout << *it;
哈希表优化:
cpp复制unordered_map<int, int> countMap;
countMap.reserve(10000); // 预分配空间减少rehash
5分钟审题:
15分钟编码:
5分钟测试:
模块化编程:
cpp复制// 将功能拆分为独立函数
void solve() {
input();
process();
output();
}
防御性编程:
cpp复制// 检查输入合法性
if (n <= 0) {
cout << 0 << endl;
return;
}
注释规范:
cpp复制/*
* 功能:计算两个区间的交集
* 参数:a1,a2 - 第一个区间端点
* b1,b2 - 第二个区间端点
* 返回:交集的长度,无交集返回0
*/
int intervalIntersect(int a1, int a2, int b1, int b2) {
// 实现代码...
}
在线判题平台:
参考书籍:
调试工具:
在实际机试准备过程中,建议每天保持3-5道中等难度题目的训练量,重点不是刷题数量,而是每道题都能彻底理解并能够快速实现。对于常考的高频题型(如二叉树遍历、动态规划、图算法等),要准备2-3种不同实现方式的代码模板,以应对不同约束条件下的题目要求。