华为机试经典算法题整理与实战解析
在准备华为机试的过程中,我们经常会遇到以下几类典型问题。以下整理了部分高频题目及核心思路,结合 C++ 代码示例,详解 STL 容器应用与状态转移方程设计。
1. 数组去重与排序
明明的随机数是一道经典的入门题。要求对生成的 N 个 1 到 1000 之间的随机整数去重并排序。处理时需注意同一个测试用例里可能会有多组数据,需要循环读取直到输入结束。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int n;
while (std::cin >> n) {
std::vector<int> nums(n);
for (int i = 0; i < n; ++i) {
std::cin >> nums[i];
}
// 先排序再去重
std::sort(nums.begin(), nums.end());
auto last = std::unique(nums.begin(), nums.end());
nums.erase(last, nums.end());
for (const auto& num : nums) {
std::cout << num << "\n";
}
}
return 0;
}
2. 字符串处理与 IP 分类
错误记录模块和 IP 地址分类是考察字符串处理的常见题型。对于错误记录,需要注意文件路径的处理:只保留最后有效 16 个字符,且目录不同但文件名行号相同需合并。IP 地址则需按 A/B/C/D/E 类归类,不合法地址单独处理。
3. 动态规划核心逻辑
最长公共子序列(LCS)和最长公共子串是动态规划的必考题。虽然两者都用二维 DP 表,但状态转移方程略有区别。

