嵌入式春招笔试高频算法题(附解题思路)

嵌入式春招笔试中,算法题是"拉分关键",也是很多应届生的"痛点"------

"刷了很多算法题,笔试还是遇不到原题"

"拿到算法题,不知道从何下手,半天写不出代码"

"代码能运行,但效率太低,达不到笔试要求"

其实,嵌入式春招笔试的算法题,不考偏题、难题,重点考察"基础算法+嵌入式场景适配",核心题型就那几种,只要掌握解题思路、熟练代码实现,就能稳稳拿分。

今天这篇,专为备战嵌入式春招的应届生、新手打造,整理了5道嵌入式春招笔试高频算法题,覆盖数组、链表、字符串、进制转换等核心考点,每道题都附上"题干+解题思路+C语言代码实现",贴合嵌入式笔试场景,可直接复制练习,帮你高效备战、快速提分。

先明确:嵌入式春招算法题核心考点(必掌握)

嵌入式春招笔试,算法题占比10%-15%,重点考察以下4类题型,覆盖80%的笔试考点,不用盲目刷题:

  1. 数组操作(排序、查找、去重,必考);

  2. 链表操作(反转、查找、删除,中大厂高频);

  3. 字符串操作(字符串反转、查找、替换,基础必考);

  4. 嵌入式特色算法(进制转换、位运算,贴合岗位需求)。

下面逐题拆解,每道题都按"题干→解题思路→代码实现"的逻辑,帮你吃透解题技巧,举一反三。

一、高频算法题1:数组排序(冒泡排序,必考)

嵌入式笔试中,排序题是基础必考题,其中冒泡排序因逻辑简单、代码简洁,成为最常考的排序算法,重点考察循环逻辑和数组操作。

✅ 题干

给定一个整型数组arr[10] = {5,3,8,1,2,7,6,4,9,0},使用冒泡排序算法,将数组按升序排列,输出排序后的数组。

✅ 解题思路(嵌入式笔试重点)

核心逻辑:通过相邻元素两两比较,将较大的元素逐步"冒泡"到数组末尾,重复多次,直到整个数组有序。

步骤拆解(贴合嵌入式C语言实现):

  • 外层循环:控制排序轮次,共需n-1轮(n为数组长度),每轮排出一个最大元素;

  • 内层循环:控制每轮的比较次数,每轮比较次数递减1(因为末尾已排好序的元素无需再比较);

  • 优化点:若某一轮没有发生元素交换,说明数组已有序,可直接退出循环(嵌入式笔试中,优化会加分)。

✅ C语言代码实现(嵌入式笔试可直接套用)

复制代码
#include<stdio.h>
// 冒泡排序(升序,带优化)voidbubble_sort(int arr[], int n){    // 外层循环:控制排序轮次    for (int i = 0; i < n - 1; i++) {        int flag = 0; // 标记是否发生交换,0表示未交换        // 内层循环:控制每轮比较次数,每轮减少1次        for (int j = 0; j < n - 1 - i; j++) {            // 相邻元素比较,大的元素后移            if (arr[j] > arr[j + 1]) {                int temp = arr[j];                arr[j] = arr[j + 1];                arr[j + 1] = temp;                flag = 1; // 标记发生交换            }        }        // 若未发生交换,说明数组已有序,直接退出        if (flag == 0) {            break;        }    }}
intmain(){    int arr[10] = {5,3,8,1,2,7,6,4,9,0};    int n = sizeof(arr) / sizeof(arr[0]);        bubble_sort(arr, n);        // 输出排序后的数组    printf("排序后数组:");    for (int i = 0; i < n; i++) {        printf("%d ", arr[i]);    }    return0;}

✅ 笔试避坑点

  • 数组长度计算:嵌入式笔试中,常考"sizeof(arr)/sizeof(arr[0])",避免手动写死长度;

  • 循环边界:内层循环条件是"j < n-1-i",避免数组越界;

  • 优化点:加入flag标记,减少不必要的循环,体现代码效率,笔试会加分。

二、高频算法题2:链表反转(中大厂高频)

链表是嵌入式开发的核心数据结构,链表反转是春招中大厂笔试的高频算法题,重点考察链表指针操作,难度适中,掌握思路就能轻松实现。

✅ 题干

定义一个单链表节点结构,实现链表反转功能,输入链表头节点,输出反转后的链表头节点(要求:原地反转,空间复杂度O(1))。

✅ 解题思路(嵌入式笔试重点)

核心逻辑:通过三个指针(prev、curr、next),逐步反转链表节点的指向,无需额外创建链表,实现原地反转(嵌入式笔试优先考察原地反转)。

步骤拆解:

  • 初始化三个指针:prev = NULL(反转后链表的尾节点),curr = 头节点(当前操作的节点),next = NULL(保存下一个节点);

  • 循环遍历链表:当curr不为NULL时,保存next节点(防止链表断裂),将curr的next指向prev,再依次移动prev、curr指针;

  • 循环结束后,prev即为反转后的链表头节点。

✅ C语言代码实现(嵌入式笔试可直接套用)

复制代码
#include<stdio.h>#include<malloc.h>
// 定义单链表节点结构(嵌入式笔试常考结构定义)typedefstructListNode {    int data;               // 节点数据    structListNode *next;  // 指向next节点的指针} ListNode;
// 链表反转(原地反转,空间复杂度O(1))ListNode* reverse_list(ListNode *head){    ListNode *prev = NULL;  // 前驱节点    ListNode *curr = head;  // 当前节点    ListNode *next = NULL;  // 后继节点        while (curr != NULL) {        next = curr->next;  // 保存下一个节点        curr->next = prev;  // 反转当前节点的指向        prev = curr;        // 移动prev指针        curr = next;        // 移动curr指针    }    return prev; // 反转后,prev为新的头节点}
// 辅助函数:创建链表(笔试可不用写,但需理解)ListNode* create_list(int arr[], int n){    if (n == 0) returnNULL;    ListNode *head = (ListNode*)malloc(sizeof(ListNode));    head->data = arr[0];    head->next = NULL;    ListNode *p = head;    for (int i = 1; i < n; i++) {        ListNode *node = (ListNode*)malloc(sizeof(ListNode));        node->data = arr[i];        node->next = NULL;        p->next = node;        p = p->next;    }    return head;}
// 辅助函数:打印链表voidprint_list(ListNode *head){    ListNode *p = head;    while (p != NULL) {        printf("%d -> ", p->data);        p = p->next;    }    printf("NULL\n");}
intmain(){    int arr[] = {1,2,3,4,5};    int n = sizeof(arr)/sizeof(arr[0]);    ListNode *head = create_list(arr, n);        printf("反转前链表:");    print_list(head);        head = reverse_list(head);        printf("反转后链表:");    print_list(head);    return0;}

✅ 笔试避坑点

  • 指针操作:避免指针空指针异常,循环条件是"curr != NULL",而非"curr->next != NULL";

  • 原地反转:嵌入式笔试中,优先实现原地反转(空间复杂度O(1)),避免额外创建链表(空间复杂度O(n)),否则会扣分;

  • 链表结构定义:牢记单链表节点结构,data+next指针,笔试中常要求先定义节点结构,再实现功能。

三、高频算法题3:字符串反转(基础必考)

字符串操作是嵌入式笔试的基础考点,字符串反转难度低、代码简洁,是必拿分的算法题,重点考察字符串指针操作和循环逻辑。

✅ 题干

给定一个字符串char str[] = "embedded",实现字符串反转功能,输出反转后的字符串(要求:原地反转,不使用额外数组)。

✅ 解题思路(嵌入式笔试重点)

核心逻辑:使用双指针(左指针left、右指针right),分别指向字符串的开头和结尾,交换两个指针指向的字符,然后逐步向中间移动指针,直到left >= right。

步骤拆解:

  • 计算字符串长度(不包含结束符'\0');

  • 初始化left = 0(字符串开头),right = 字符串长度-1(字符串结尾);

  • 循环交换left和right指向的字符,然后left++、right--,直到left >= right。

✅ C语言代码实现(嵌入式笔试可直接套用)

复制代码
#include<stdio.h>#include<string.h>
// 字符串反转(原地反转,不使用额外数组)voidreverse_string(char str[]){    int len = strlen(str); // 计算字符串长度(不含'\0')    int left = 0;          // 左指针,指向字符串开头    int right = len - 1;   // 右指针,指向字符串结尾        while (left < right) {        // 交换两个指针指向的字符        char temp = str[left];        str[left] = str[right];        str[right] = temp;                left++;  // 左指针右移        right--; // 右指针左移    }}
intmain(){    char str[] = "embedded";    printf("反转前字符串:%s\n", str);        reverse_string(str);        printf("反转后字符串:%s\n", str);    return0;}

✅ 笔试避坑点

  • 字符串结束符:strlen()函数计算的是字符串有效长度(不含'\0'),避免将right设为len;

  • 原地反转:不使用额外数组,直接操作原字符串,符合嵌入式笔试的效率要求;

  • 字符数组:注意字符串必须定义为字符数组(char str[]),不能定义为字符指针(char *str),否则无法修改字符串内容(笔试常考错误点)。

四、高频算法题4:进制转换(嵌入式特色,必考)

嵌入式开发中,经常涉及进制转换(十进制→二进制/十六进制),是春招笔试的特色算法题,重点考察位运算和循环逻辑,贴合嵌入式岗位需求。

✅ 题干

实现一个函数,将十进制整数n(正整数)转换为二进制字符串,输出转换后的二进制字符串(要求:不使用库函数,手动实现)。

✅ 解题思路(嵌入式笔试重点)

核心逻辑:利用"除2取余,逆序排列"的方法,通过位运算(n & 1)获取当前最低位,然后将n右移1位,重复操作,直到n为0,最后将余数逆序,即为二进制字符串。

步骤拆解:

  • 定义一个字符数组,用于存储二进制余数(从低位到高位);

  • 循环:当n > 0时,用n & 1获取最低位(0或1),存入字符数组,然后n = n >> 1(右移1位,等价于n/2);

  • 逆序输出字符数组,即为二进制字符串(因为存储时是从低位到高位,逆序后才是正确的二进制顺序)。

✅ C语言代码实现(嵌入式笔试可直接套用)

复制代码
#include<stdio.h>#include<string.h>
// 十进制转二进制(手动实现,不使用库函数)voiddecimal_to_binary(int n, char binary[]){    int i = 0; // 用于记录二进制余数的位置    // 除2取余,存储余数(从低位到高位)    while (n > 0) {        binary[i] = (n & 1) + '0'; // 取最低位,转换为字符        n = n >> 1; // 右移1位,等价于n = n / 2        i++;    }    binary[i] = '\0'; // 给字符串加结束符        // 逆序字符串(余数存储是低位到高位,需逆序)    reverse_string(binary); // 复用前面的字符串反转函数}
// 复用字符串反转函数(笔试可直接写在一起)voidreverse_string(char str[]){    int len = strlen(str);    int left = 0, right = len - 1;    while (left < right) {        char temp = str[left];        str[left] = str[right];        str[right] = temp;        left++;        right--;    }}
intmain(){    int n = 15; // 示例:十进制15 → 二进制1111    char binary[32] = {0}; // 二进制字符串,最多32位(适配int类型)        decimal_to_binary(n, binary);        printf("十进制%d转换为二进制:%s\n", n, binary);    return0;}

✅ 笔试避坑点

  • 位运算使用:嵌入式笔试中,优先使用位运算(&、>>)实现进制转换,比除法(n/2)效率更高,更贴合嵌入式开发场景;

  • 字符转换:余数(0/1)转换为字符时,需加'0'(即ASCII码偏移),否则会输出乱码;

  • 字符串逆序:存储余数时是从低位到高位,必须逆序后才是正确的二进制字符串,忘记逆序会导致结果错误(笔试高频错误点)。

五、高频算法题5:数组去重(春招高频)

数组去重是嵌入式春招笔试的高频题,重点考察数组遍历和逻辑判断,难度适中,核心是"找到重复元素,保留唯一元素",适配嵌入式数据处理场景。

✅ 题干

给定一个有序整型数组arr[] = {1,2,2,3,3,3,4,5,5},实现数组去重功能,输出去重后的数组和去重后的长度(要求:原地去重,不使用额外数组)。

✅ 解题思路(嵌入式笔试重点)

核心逻辑:利用"双指针法",一个指针(i)用于遍历数组,另一个指针(j)用于记录去重后数组的下标,遍历过程中,若当前元素与前一个元素不同,则保留该元素,j指针后移。

步骤拆解(适配有序数组,嵌入式笔试常考有序数组去重):

  • 初始化j = 1(去重后数组的第二个元素下标,第一个元素默认唯一);

  • 遍历数组(i从1开始):若arr[i] != arr[j-1],则将arr[i]赋值给arr[j],j++;

  • 遍历结束后,j的值即为去重后的数组长度,arr[0..j-1]即为去重后的数组。

✅ C语言代码实现(嵌入式笔试可直接套用)

复制代码
#include<stdio.h>
// 有序数组去重(原地去重,不使用额外数组)intremove_duplicates(int arr[], int n){    if (n == 0) return0; // 数组为空,返回0    int j = 1; // j记录去重后数组的下标,初始为1(第一个元素唯一)    // 遍历数组,i从1开始(跳过第一个元素)    for (int i = 1; i < n; i++) {        // 若当前元素与前一个唯一元素不同,保留该元素        if (arr[i] != arr[j-1]) {            arr[j] = arr[i];            j++;        }    }    return j; // 返回去重后的数组长度}
intmain(){    int arr[] = {1,2,2,3,3,3,4,5,5};    int n = sizeof(arr)/sizeof(arr[0]);        int new_len = remove_duplicates(arr, n);        // 输出去重后的数组    printf("去重后数组:");    for (int i = 0; i < new_len; i++) {        printf("%d ", arr[i]);    }    printf("\n去重后数组长度:%d\n", new_len);    return0;}

✅ 笔试避坑点

  • 数组有序:该方法仅适用于有序数组,嵌入式笔试中,数组去重大概率是有序数组,若为无序数组,需先排序再去重;

  • 原地去重:不使用额外数组,直接修改原数组,符合嵌入式笔试的效率要求;

  • 返回值:笔试中,常要求返回去重后的数组长度,注意j的含义(去重后数组的长度),避免返回错误。

六、春招算法题备考技巧(必记)

嵌入式春招算法题,不用刷遍所有算法,重点掌握"基础算法+嵌入式场景适配",记住这4个备考技巧,高效提分:

  • 优先掌握高频题型:重点练习本文整理的5道题,覆盖数组、链表、字符串、进制转换,能应对80%的笔试算法题;

  • 代码简洁高效:嵌入式笔试中,算法题重点考察"逻辑正确性+代码效率",优先使用位运算、原地操作,避免冗余代码;

  • 多动手练习:每道题至少写2-3遍,熟练代码实现,避免"看懂思路,写不出代码";

  • 结合真题练习:找嵌入式春招真题,模拟笔试场景,熟悉题型和答题节奏,提升应试能力。

七、春招算法冲刺:精准发力,稳拿高分

很多应届生,刷了很多算法题,却还是在笔试中翻车------ 要么思路不清晰,要么代码有bug,要么不符合嵌入式场景要求,白白浪费春招机会。

嵌入式春招算法题,核心是"基础+适配",不用追求难题,只要掌握高频题型的解题思路,熟练C语言代码实现,就能稳稳拿分。

相关推荐
像污秽一样2 小时前
算法设计与分析-习题9.1
数据结构·算法·dfs·dp·贪婪
無限進步D2 小时前
差分算法 cpp
c++·算法·蓝桥杯·竞赛
星空露珠2 小时前
迷你世界UGC3.0脚本Wiki生物模块管理接口 Monster
开发语言·数据结构·算法·游戏·lua
星空露珠2 小时前
迷你世界UGC3.0脚本Wiki世界模块管理接口 World
开发语言·数据库·算法·游戏·lua
阿贵---2 小时前
C++中的装饰器模式
开发语言·c++·算法
放下华子我只抽RuiKe52 小时前
机器学习核心算法全景指南
人工智能·python·深度学习·算法·机器学习·机器人·交互
FluxMelodySun2 小时前
机器学习(二十四) 降维 : MDS降维方法与线性降维方法
人工智能·算法·机器学习
setmoon2142 小时前
C++中的装饰器模式高级应用
开发语言·c++·算法
I_LPL2 小时前
day56 代码随想录算法训练营 图论专题9
算法·图论