C言算法面试:分类与高频题解析

news/2025/1/30 9:25:27/

C言算法面试:分类与高频题解析

算法在编程面试中是必考的内容,熟练掌握常见的算法类型和解题思路是通往 offer 的关键。本文将对算法面试题进行分类,总结高频题目,并给出用 C 语言实现的示例代码。


一、算法面试题分类

1. 数组与字符串

  • 特点:线性数据结构,容易产生边界问题。
  • 常见考点
    • 双指针
    • 滑动窗口
    • 排序与搜索
高频题:
  1. 两数之和
    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数,并返回它们的数组下标。

代码实现

#include <stdio.h>
#include <stdlib.h>// 哈希表结构体
typedef struct {int key;int value;
} HashNode;int* twoSum(int* nums, int numsSize, int target, int* returnSize) {HashNode* hashTable = (HashNode*)malloc(numsSize * sizeof(HashNode));int hashSize = 0;for (int i = 0; i < numsSize; i++) {int complement = target - nums[i];for (int j = 0; j < hashSize; j++) {if (hashTable[j].key == complement) {int* result = (int*)malloc(2 * sizeof(int));result[0] = hashTable[j].value;result[1] = i;*returnSize = 2;free(hashTable);return result;}}hashTable[hashSize].key = nums[i];hashTable[hashSize].value = i;hashSize++;}*returnSize = 0;free(hashTable);return NULL;
}int main() {int nums[] = {2, 7, 11, 15};int target = 9;int returnSize;int* result = twoSum(nums, 4, target, &returnSize);if (result != NULL) {printf("Index1 = %d, Index2 = %d\n", result[0], result[1]);free(result);} else {printf("No solution found.\n");}return 0;
}

2. 链表

  • 特点:动态数据结构,考察指针操作。
  • 常见考点
    • 快慢指针
    • 链表的反转
    • 环检测
高频题:
  1. 反转链表
    给定一个单链表,反转链表并返回反转后的头节点。

代码实现

#include <stdio.h>
#include <stdlib.h>typedef struct ListNode {int val;struct ListNode* next;
} ListNode;// 反转链表函数
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev = NULL;struct ListNode* current = head;while (current != NULL) {struct ListNode* nextTemp = current->next;current->next = prev;prev = current;current = nextTemp;}return prev;
}// 测试代码
void printList(ListNode* head) {while (head != NULL) {printf("%d -> ", head->val);head = head->next;}printf("NULL\n");
}int main() {ListNode* head = (ListNode*)malloc(sizeof(ListNode));head->val = 1;head->next = (ListNode*)malloc(sizeof(ListNode));head->next->val = 2;head->next->next = (ListNode*)malloc(sizeof(ListNode));head->next->next->val = 3;head->next->next->next = NULL;printf("Original List: ");printList(head);ListNode* reversed = reverseList(head);printf("Reversed List: ");printList(reversed);return 0;
}

3. 栈与队列

  • 特点:先进后出(栈)与先进先出(队列)。
  • 常见考点
    • 括号匹配
    • 单调栈
    • 滑动窗口最大值
高频题:
  1. 有效的括号
    给定一个只包括 ()[]{} 的字符串,判断字符串是否有效。

代码实现

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>bool isValid(char* s) {char* stack = (char*)malloc(strlen(s) * sizeof(char));int top = -1;for (int i = 0; s[i] != '\0'; i++) {char c = s[i];if (c == '(' || c == '{' || c == '[') {stack[++top] = c;} else {if (top == -1) {free(stack);return false;}char topChar = stack[top--];if ((c == ')' && topChar != '(') ||(c == '}' && topChar != '{') ||(c == ']' && topChar != '[')) {free(stack);return false;}}}bool result = (top == -1);free(stack);return result;
}int main() {char* s = "({[]})";if (isValid(s)) {printf("The string is valid.\n");} else {printf("The string is invalid.\n");}return 0;
}

4. 动态规划

  • 特点:通过状态转移方程解决问题。
  • 常见考点
    • 背包问题
    • 最长子序列/子数组
    • 零钱兑换
高频题:
  1. 最长公共子序列
    给定两个字符串,返回它们的最长公共子序列的长度。

代码实现

#include <stdio.h>
#include <string.h>int longestCommonSubsequence(char* text1, char* text2) {int m = strlen(text1), n = strlen(text2);int dp[m + 1][n + 1];for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else if (text1[i - 1] == text2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];}}}return dp[m][n];
}int main() {char* text1 = "abcde";char* text2 = "ace";printf("The length of LCS is %d\n", longestCommonSubsequence(text1, text2));return 0;
}

二、总结

  • 核心思路:清晰的逻辑和代码优化是面试的关键。
  • 实战建议:熟悉常见算法类型及高频题目,确保代码实现无误。

通过本文的讲解,希望你能够在算法面试中更加自信!


http://www.ppmy.cn/news/1567856.html

相关文章

如何在AWS上部署一个Web应用?

随着云计算的普及&#xff0c;越来越多的开发者选择将 Web 应用部署到 AWS&#xff08;Amazon Web Services&#xff09;上。AWS 提供了丰富的云服务&#xff0c;包括计算、存储、数据库等&#xff0c;适用于不同规模的项目。本文将详细介绍如何在 AWS 上部署一个简单的 Web 应…

掌握Gradle构建脚本:Kotlin DSL配置指南与最佳实践

文章目录 Gradle构建文件核心解析构建脚本的层次结构 关键配置id()函数组名称和版本仓库配置导入依赖配置 高效开发实践指南核心开发原则调试与问题排查总结 作为现代JVM生态中最强大的构建工具之一&#xff0c;Gradle凭借其声明式语法和灵活的可扩展性深受开发者喜爱。本文将深…

【论文推荐|深度学习,滑坡检测,多光谱影像,自然灾害,遥感】2022年Landslide4Sense竞赛成果:基于多源卫星影像的先进滑坡检测算法研究(一)

【论文推荐|深度学习&#xff0c;滑坡检测&#xff0c;多光谱影像&#xff0c;自然灾害&#xff0c;遥感】2022年Landslide4Sense竞赛成果&#xff1a;基于多源卫星影像的先进滑坡检测算法研究&#xff08;一&#xff09; 【论文推荐|深度学习&#xff0c;滑坡检测&#xff0c…

HTML新春烟花

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09…

五、华为 RSTP

RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树协议&#xff09;是 STP 的优化版本&#xff0c;能实现网络拓扑的快速收敛。 一、RSTP 原理 快速收敛机制&#xff1a;RSTP 通过引入边缘端口、P/A&#xff08;Proposal/Agreement&#xff09;机制等&…

mac 电脑上安装adb命令

在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;android studio&#xff09; Android Studio官网下载链接 详细的安装连接请参考 Mac 安装Android studio 2、配置环境 在安装完成之后&#xff0c;将android的adb工具所在…

python3+TensorFlow 2.x(三)手写数字识别

目录 代码实现 模型解析&#xff1a; 1、加载 MNIST 数据集&#xff1a; 2、数据预处理&#xff1a; 3、构建神经网络模型&#xff1a; 4、编译模型&#xff1a; 5、训练模型&#xff1a; 6、评估模型&#xff1a; 7、预测和可视化结果&#xff1a; 输出结果&#xff…

pyautogui操控Acrobat DC pro万能PDF转Word,不丢任何PDF格式样式

为了将PDF转换脚本改为多进程异步处理&#xff0c;我们需要确保每个进程独立操作不同的Acrobat窗口。以下是实现步骤&#xff1a; 实现代码 import os import pyautogui import time import subprocess import pygetwindow as gw from multiprocessing import Pooldef conver…