Q1~5: 基础编程题
涵盖了基本的循环、条件判断、数组和字符串操作等C语言的基础知识.
Q6~10: 中级编程题
涉及了数据结构(链表、二叉树)、高级算法(快速排序、动态规划)和经典问题(N皇后问题)的解决。
Q11~15: 高级编程题
涉及缓存机制、图算法(深度优先搜索、Dijkstra算法、拓扑排序)、字符串匹配算法(KMP)等高级编程主题。
Q1. 打印斐波那契数列
```c
#include <stdio.h>
void printFibonacci(int n) {
int t1 = 0, t2 = 1, nextTerm;
for (int i = 1; i <= n; ++i) {
printf("%d, ", t1);
nextTerm = t1 + t2;
t1 = t2;
t2 = nextTerm;
}
}
int main() {
int n;
printf("Enter the number of terms: ");
scanf("%d", &n);
printFibonacci(n);
return 0;
}
```
Q2. 判断素数
```c
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int n) {
if (n <= 1) return false;
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) return false;
}
return true;
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d is a prime number.\n", n);
} else {
printf("%d is not a prime number.\n", n);
}
return 0;
}
```
Q3. 求数组最大值
```c
#include <stdio.h>
int findMax(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int n;
printf("Enter number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter elements: ");
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("The maximum element is %d\n", findMax(arr, n));
return 0;
}
```
Q4. 字符串逆序
```c
#include <stdio.h>
#include <string.h>
void reverseString(char str[]) {
int n = strlen(str);
for (int i = 0; i < n / 2; i++) {
char temp = str[i];
str[i] = str[n - i - 1];
str[n - i - 1] = temp;
}
}
int main() {
char str[100];
printf("Enter a string: ");
gets(str);
reverseString(str);
printf("Reversed string is: %s\n", str);
return 0;
}
```
Q5. 求阶乘
```c
#include <stdio.h>
int factorial(int n) {
if (n == 0) return 1;
return n * factorial(n - 1);
}
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
printf("Factorial of %d is %d\n", n, factorial(n));
return 0;
}
```
Q6. 链表反转
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* reverse(struct Node* head) {
struct Node* prev = NULL;
struct Node* current = head;
struct Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
void printList(struct Node* head) {
struct Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
second = (struct Node*)malloc(sizeof(struct Node));
third = (struct Node*)malloc(sizeof(struct Node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
printf("Original list: ");
printList(head);
head = reverse(head);
printf("Reversed list: ");
printList(head);
return 0;
}
Q7. 二叉树的高度
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
int max(int a, int b) {
return (a > b) ? a : b;
}
int height(struct Node* node) {
if (node == NULL)
return 0;
return 1 + max(height(node->left), height(node->right));
}
struct Node* newNode(int data) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
int main() {
struct Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
printf("Height of tree is %d\n", height(root));
return 0;
}
Q8. 快速排序
#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
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);
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("Sorted array: \n");
printArray(arr, n);
return 0;
}
Q9. 求两个字符串的最长公共子序列
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int lcs(char* X, char* Y, int m, int n) {
int L[m + 1][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() {
char X[] = "AGGTAB";
char Y[] = "GXTXAYB";
int m = strlen(X);
int n = strlen(Y);
printf("Length of LCS is %d\n", lcs(X, Y, m, n));
return 0;
}
Q10. 解决N皇后问题
#include <stdio.h>
#include <stdbool.h>
#define N 8
void printSolution(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf(" %d ", board[i][j]);
printf("\n");
}
}
bool isSafe(int board[N][N], int row, int col) {
int i, j;
for (i = 0; i < col; i++)
if (board[row][i])
return false;
for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
if (board[i][j])
return false;
for (i = row, j = col; j >= 0 && i < N; i++, j--)
if (board[i][j])
return false;
return true;
}
bool solveNQUtil(int board[N][N], int col) {
if (col >= N)
return true;
for (int i = 0; i < N; i++) {
if (isSafe(board, i, col)) {
board[i][col] = 1;
if (solveNQUtil(board, col + 1))
return true;
board[i][col] = 0;
}
}
return false;
}
bool solveNQ() {
int board[N][N] = { { 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 } };
if (solveNQUtil(board, 0) == false) {
printf("Solution does not exist");
return false;
}
printSolution(board);
return true;
}
int main() {
solveNQ();
return 0;
}
Q11. LRU缓存机制
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int key;
int value;
struct Node* prev;
struct Node* next;
} Node;
typedef struct {
int capacity;
int size;
Node* head;
Node* tail;
Node** hashTable;
} LRUCache;
Node* createNode(int key, int value) {
Node* node = (Node*)malloc(sizeof(Node));
node->key = key;
node->value = value;
node->prev = NULL;
node->next = NULL;
return node;
}
LRUCache* createCache(int capacity) {
LRUCache* cache = (LRUCache*)malloc(sizeof(LRUCache));
cache->capacity = capacity;
cache->size = 0;
cache->head = createNode(0, 0);
cache->tail = createNode(0, 0);
cache->head->next = cache->tail;
cache->tail->prev = cache->head;
cache->hashTable = (Node**)malloc(sizeof(Node*) * 10000); // assuming a large enough size
for (int i = 0; i < 10000; i++) {
cache->hashTable[i] = NULL;
}
return cache;
}
void removeNode(Node* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
void insertNode(LRUCache* cache, Node* node) {
node->next = cache->head->next;
node->prev = cache->head;
cache->head->next->prev = node;
cache->head->next = node;
}
int get(LRUCache* cache, int key) {
Node* node = cache->hashTable[key];
if (node == NULL) {
return -1;
}
removeNode(node);
insertNode(cache, node);
return node->value;
}
void put(LRUCache* cache, int key, int value) {
Node* node = cache->hashTable[key];
if (node != NULL) {
node->value = value;
removeNode(node);
insertNode(cache, node);
} else {
if (cache->size == cache->capacity) {
Node* tail = cache->tail->prev;
removeNode(tail);
cache->hashTable[tail->key] = NULL;
free(tail);
cache->size--;
}
Node* newNode = createNode(key, value);
insertNode(cache, newNode);
cache->hashTable[key] = newNode;
cache->size++;
}
}
int main() {
LRUCache* cache = createCache(2);
put(cache, 1, 1);
put(cache, 2, 2);
printf("Get 1: %d\n", get(cache, 1)); // returns 1
put(cache, 3, 3); // evicts key 2
printf("Get 2: %d\n", get(cache, 2)); // returns -1 (not found)
put(cache, 4, 4); // evicts key 1
printf("Get 1: %d\n", get(cache, 1)); // returns -1 (not found)
printf("Get 3: %d\n", get(cache, 3)); // returns 3
printf("Get 4: %d\n", get(cache, 4)); // returns 4
return 0;
}
Q12. 图的深度优先搜索
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int vertex;
struct Node* next;
} Node;
typedef struct Graph {
int numVertices;
int* visited;
Node** adjLists;
} Graph;
Node* createNode(int v) {
Node* newNode = malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
Graph* createGraph(int vertices) {
Graph* graph = malloc(sizeof(Graph));
graph->numVertices = vertices;
graph->adjLists = malloc(vertices * sizeof(Node*));
graph->visited = malloc(vertices * sizeof(int));
for (int i = 0; i < vertices; i++) {
graph->adjLists[i] = NULL;
graph->visited[i] = 0;
}
return graph;
}
void addEdge(Graph* graph, int src, int dest) {
Node* newNode = createNode(dest);
newNode->next = graph->adjLists[src];
graph->adjLists[src] = newNode;
newNode = createNode(src);
newNode->next = graph->adjLists[dest];
graph->adjLists[dest] = newNode;
}
void DFS(Graph* graph, int vertex) {
Node* adjList = graph->adjLists[vertex];
Node* temp = adjList;
graph->visited[vertex] = 1;
printf("Visited %d\n", vertex);
while (temp != NULL) {
int connectedVertex = temp->vertex;
if (graph->visited[connectedVertex] == 0) {
DFS(graph, connectedVertex);
}
temp = temp->next;
}
}
int main() {
Graph* graph = createGraph(4);
addEdge(graph, 0, 1);
addEdge(graph, 0, 2);
addEdge(graph, 1, 2);
addEdge(graph, 2, 3);
DFS(graph, 0);
return 0;
}
Q13. Dijkstra算法
#include <stdio.h>
#include <limits.h>
#define V 9
int minDistance(int dist[], int sptSet[]) {
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (sptSet[v] == 0 && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void printSolution(int dist[], int n) {
printf("Vertex \t Distance from Source\n");
for (int i = 0; i < V; i++)
printf("%d \t %d\n", i, dist[i]);
}
void dijkstra(int graph[V][V], int src) {
int dist[V];
int sptSet[V];
for (int i = 0; i < V; i++)
dist[i] = INT_MAX, sptSet[i] = 0;
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
sptSet[u] = 1;
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
printSolution(dist, V);
}
int main() {
int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},
{4, 0, 8, 0, 0, 0, 0, 11, 0},
{0, 8, 0, 7, 0, 4, 0, 0, 2},
{0, 0, 7, 0, 9, 14, 0, 0, 0},
{0, 0, 0, 9, 0, 10, 0, 0, 0},
{0, 0, 4, 14, 10, 0, 2, 0, 0},
{0, 0, 0, 0, 0, 2, 0, 1, 6},
{8, 11, 0, 0, 0, 0, 1, 0, 7},
{0, 0, 2, 0, 0, 0, 6, 7, 0}};
dijkstra(graph, 0);
return 0;
}
Q14. KMP字符串匹配算法
#include <stdio.h>
#include <string.h>
void computeLPSArray(char* pat, int M, int* lps) {
int length = 0;
lps[0] = 0;
int i = 1;
while (i < M) {
if (pat[i] == pat[length]) {
length++;
lps[i] = length;
i++;
} else {
if (length != 0) {
length = lps[length - 1];
} else {
lps[i] = 0;
i++;
}
}
}
}
void KMPSearch(char* pat, char* txt) {
int M = strlen(pat);
int N = strlen(txt);
int
lps[M];
computeLPSArray(pat, M, lps);
int i = 0;
int j = 0;
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
printf("Found pattern at index %d\n", i - j);
j = lps[j - 1];
} else if (i < N && pat[j] != txt[i]) {
if (j != 0)
j = lps[j - 1];
else
i = i + 1;
}
}
}
int main() {
char txt[] = "ABABDABACDABABCABAB";
char pat[] = "ABABCABAB";
KMPSearch(pat, txt);
return 0;
}
Q15. 图的拓扑排序
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int adj[MAX][MAX];
int visited[MAX];
int n;
void initialize() {
for (int i = 0; i < n; i++) {
visited[i] = 0;
for (int j = 0; j < n; j++) {
adj[i][j] = 0;
}
}
}
void addEdge(int start, int end) {
adj[start][end] = 1;
}
void DFS(int v, int* stack, int* top) {
visited[v] = 1;
for (int i = 0; i < n; i++) {
if (adj[v][i] && !visited[i]) {
DFS(i, stack, top);
}
}
stack[(*top)++] = v;
}
void topologicalSort() {
int stack[MAX];
int top = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
DFS(i, stack, &top);
}
}
printf("Topological Sort: ");
while (top > 0) {
printf("%d ", stack[--top]);
}
printf("\n");
}
int main() {
n = 6;
initialize();
addEdge(5, 2);
addEdge(5, 0);
addEdge(4, 0);
addEdge(4, 1);
addEdge(2, 3);
addEdge(3, 1);
topologicalSort();
return 0;
}