C语言面试经典问题
发布人:shili8
发布时间:2024-11-08 23:11
阅读次数:0
**C语言面试经典问题**
作为一名程序员,掌握C语言是非常重要的。以下是一些常见的C语言面试经典问题,包括一些代码示例和注释。
###1. 冒泡排序冒泡排序是一种简单的排序算法,它通过反复地交换相邻两个元素,如果前一个元素大于后一个元素,则交换它们。这样一来,最后一个元素就是最大的数。
cvoid bubbleSort(int arr[], int n) { for (int i =0; i < n -1; i++) { // 每轮比较n-i-1个数字 for (int j =0; j < n - i -1; j++) { if (arr[j] > arr[j +1]) { // 如果前一个元素大于后一个元素,则交换它们 int temp = arr[j]; arr[j] = arr[j +1]; arr[j +1] = temp; } } } }
###2. 快速排序快速排序是一种高效的排序算法,它通过选择一个基准值,然后将其他元素分成两部分,分别比基准值小和大。
cvoid 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[low]; int i = low +1; int j = high; while (i <= j) { // 如果左边元素小于基准值,则移动到右边 if (arr[i] < pivot) { i++; } // 如果右边元素大于基准值,则移动到左边 else if (arr[j] > pivot) { j--; } // 如果左边元素大于基准值和右边元素小于基准值,则交换它们 else { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } // 将基准值移动到正确的位置 int temp = arr[low]; arr[low] = arr[j]; arr[j] = temp; return j; }
###3. 二分查找二分查找是一种高效的查找算法,它通过对数据进行排序,然后使用二分法来找到目标元素。
cint binarySearch(int arr[], int n, int target) { int low =0; int high = n -1; while (low <= high) { // 计算中间索引 int mid = (low + high) /2; // 如果目标元素等于中间元素,则找到目标元素 if (arr[mid] == target) { return mid; } // 如果目标元素小于中间元素,则移动到左边 else if (arr[mid] > target) { high = mid -1; } // 如果目标元素大于中间元素,则移动到右边 else { low = mid +1; } } // 如果没有找到目标元素,则返回-1 return -1; }
###4. 最长公共子序列最长公共子序列是一种动态规划问题,它通过计算两个序列的所有可能的子序列,然后找出其中最长的公共子序列。
cint longestCommonSubsequence(char str1[], char str2[]) { int m = strlen(str1); int n = strlen(str2); // 创建一个二维数组来存储每个位置的最长公共子序列长度 int dp[m +1][n +1]; for (int i =0; i <= m; i++) { for (int j =0; j <= n; j++) { // 如果两个字符串都为空,则最长公共子序列长度为0 if (i ==0 && j ==0) { dp[i][j] =0; } // 如果第一个字符串为空,则最长公共子序列长度等于第二个字符串的长度 else if (i ==0) { dp[i][j] = j; } // 如果第二个字符串为空,则最长公共子序列长度等于第一个字符串的长度 else if (j ==0) { dp[i][j] = i; } // 如果当前位置的字符相等,则最长公共子序列长度等于上一位置的值加1 else if (str1[i -1] == str2[j -1]) { dp[i][j] = dp[i -1][j -1] +1; } // 如果当前位置的字符不相等,则最长公共子序列长度等于上一位置中较大值 else { dp[i][j] = max(dp[i -1][j], dp[i][j -1]); } } } return dp[m][n]; }
###5. 最小生成树最小生成树是一种图论问题,它通过找到一个连接所有顶点的边集,使得总权值最小。
cint minSpanningTree(int graph[][10]) { int n =10; // 创建一个二维数组来存储每个位置的最小生成树长度 int dp[n][n]; for (int i =0; i < n; i++) { for (int j =0; j < n; j++) { // 如果两个顶点相连,则最小生成树长度等于边权值 if (i != j) { dp[i][j] = graph[i][j]; } // 如果两个顶点不相连,则最小生成树长度为无穷大 else { dp[i][j] = INT_MAX; } } } for (int k =0; k < n; k++) { for (int i =0; i < n; i++) { for (int j =0; j < n; j++) { // 如果当前位置的值小于上一位置的值,则更新最小生成树长度 if (dp[i][j] > dp[i][k] + dp[k][j]) { dp[i][j] = dp[i][k] + dp[k][j]; } } } } return dp[0][n -1]; }
以上是C语言面试经典问题的部分代码示例和注释。这些问题涉及排序、查找、动态规划等算法,都是程序员需要掌握的基本技能。