c++算法面试题
时间: 2025-07-21 21:29:48 浏览: 2
### C++ 算法面试题与准备
C++ 算法面试题通常考察候选人的编程能力、逻辑思维、问题解决能力以及对算法和数据结构的掌握。以下是一些经典的 C++ 算法面试题和相关准备建议。
#### 经典算法面试题
1. **字符串处理**
一个常见问题是将字符串中的某个字符(例如 `'*'`)移动到字符串的前面,同时保持其他字符的相对顺序。这个问题可以通过双指针法实现,尽量减少时间复杂度和辅助空间的使用。例如,对于输入字符串 `"ab**cd**e*12"`,处理后输出应为 `"*****abcde12"`,并且函数返回值为 `5`。
```cpp
int change(char *str) {
int i, j = strlen(str) - 1;
for (i = j; j >= 0; j--) {
if (str[j] != '*') {
i--;
} else if (str[i] != '*') {
str[i--] = str[j];
str[j] = '*';
}
}
return i + 1;
}
```
2. **排序算法**
快速排序是常见的面试题之一,其核心思想是通过递归将数组划分为较小的部分进行排序。以下是快速排序的一个实现示例:
```cpp
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
return i + 1;
}
```
3. **链表操作**
反转链表是一个经典问题,通常要求在不使用额外空间的情况下完成。以下是单链表反转的实现:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* current = head;
while (current) {
ListNode* nextNode = current->next;
current->next = prev;
prev = current;
current = nextNode;
}
return prev;
}
```
4. **动态规划**
动态规划是解决最优化问题的重要工具。例如,求解最长递增子序列(LIS)问题时,可以通过动态规划实现:
```cpp
int lengthOfLIS(std::vector<int>& nums) {
int n = nums.size();
std::vector<int> dp(n, 1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = std::max(dp[i], dp[j] + 1);
}
}
}
return *std::max_element(dp.begin(), dp.end());
}
```
5. **二叉树遍历**
二叉树的遍历是基础但重要的问题,包括前序、中序和后序遍历。以下是非递归实现的中序遍历:
```cpp
void inorderTraversal(TreeNode* root) {
std::stack<TreeNode*> stack;
TreeNode* current = root;
while (current || !stack.empty()) {
while (current) {
stack.push(current);
current = current->left;
}
current = stack.top();
stack.pop();
std::cout << current->val << " ";
current = current->right;
}
}
```
#### 面试准备建议
1. **熟悉数据结构**
熟练掌握数组、链表、栈、队列、树、图等常见数据结构,并理解它们的适用场景和操作复杂度。
2. **掌握常用算法**
包括排序、查找、动态规划、贪心算法、回溯、深度优先搜索(DFS)、广度优先搜索(BFS)等。
3. **练习编程题**
在 LeetCode、HackerRank、Codeforces 等平台上练习算法题,逐步提升解题能力。
4. **优化代码效率**
理解时间复杂度和空间复杂度的概念,尽量写出高效的代码,避免不必要的重复计算。
5. **模拟面试**
通过模拟面试或与他人讨论解题思路,提升临场应变能力和沟通表达能力。
6. **阅读经典书籍**
《算法导论》、《编程之美》、《剑指 Offer》等书籍是准备算法面试的重要参考资料。
####
阅读全文
相关推荐

















