C++作为一门历史悠久且功能强大的编程语言,在全球范围内有着广泛的应用。为了帮助你在学习C++的道路上更加扎实,以下是一些经典的编程题目,通过解决这些问题,你将能够快速提升你的编程技能。
1. 排序算法
冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
#include <iostream>
using namespace std;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
swap(arr[j], arr[j+1]);
}
}
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
cout << "Sorted array: \n";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
快速排序
快速排序是一种分而治之的排序算法,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序。
#include <iostream>
using namespace std;
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
cout << "Sorted array: \n";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
2. 链表操作
单链表反转
单链表反转是链表操作中的一个基本问题,它要求你将链表中的节点顺序颠倒。
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* reverseList(Node* head) {
Node* prev = NULL;
Node* current = head;
Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
head = prev;
return head;
}
void printList(Node* n) {
while (n != NULL) {
cout << n->data << " ";
n = n->next;
}
cout << "\n";
}
int main() {
Node* head = new Node();
head->data = 1;
head->next = new Node();
head->next->data = 2;
head->next->next = new Node();
head->next->next->data = 3;
cout << "Original List: ";
printList(head);
head = reverseList(head);
cout << "Reversed List: ";
printList(head);
return 0;
}
3. 动态规划
最长公共子序列
最长公共子序列(Longest Common Subsequence,LCS)问题是动态规划中一个经典的例子。它要求找出两个序列中最长的公共子序列。
#include <iostream>
#include <vector>
using namespace std;
int LCSLength(string X, string Y) {
int m = X.size();
int n = Y.size();
vector<vector<int>> L(m + 1, vector<int>(n + 1));
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0)
L[i][j] = 0;
else if (X[i - 1] == Y[j - 1])
L[i][j] = L[i - 1][j - 1] + 1;
else
L[i][j] = max(L[i - 1][j], L[i][j - 1]);
}
}
return L[m][n];
}
int main() {
string X = "AGGTAB";
string Y = "GXTXAYB";
cout << "Length of LCS is " << LCSLength(X, Y) << endl;
return 0;
}
通过以上几个经典的编程题目,你可以更好地理解和掌握C++编程的基本概念和技巧。不断地练习和挑战自己,你将能够在这个编程领域取得更大的进步。
