当前位置:实例文章 » 其他实例» [文章]C语言面试经典问题

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语言面试经典问题的部分代码示例和注释。这些问题涉及排序、查找、动态规划等算法,都是程序员需要掌握的基本技能。

其他信息

其他资源

Top