嵌入式工程师的乐扣LeetCode刷题攻略与建议(适合小白入门进阶)
前言:作为一名嵌入式工程师,我们日常打交道的是寄存器、MCU、RTOS、内存受限的硬件环境,看似和力扣算法刷题关联不大,但校招笔试、社招面试、底层代码优化、嵌入式算法实现都离不开扎实的算法功底。不管是 STM32 开发、Linux 驱动、物联网嵌入式,还是车载/工业嵌入式岗位,数组、链表、栈、二分查找、动态规划等基础题型都是高频考点。作者当时秋招的时候也是进行了持续 3 个月的乐扣刷题操作。希望这篇博文能给读者朋友的工程项目给予些许帮助,Respect!


LeetCode 官网:力扣 (LeetCode) 全球极客挚爱的技术成长平台
一、嵌入式工程师刷题目标:精准对接岗位需求,不做无用功
嵌入式与纯后端、算法岗相比,嵌入式刷题要紧扣硬件环境、底层开发、笔试考点,针对性定目标:
应届生校招/转行入门:主攻C语言实现、简单+中等高频题,聚焦数组、链表、栈、指针操作,夯实底层逻辑,应对笔试手撕代码;
社招进阶/驱动开发:深挖内存优化、复杂度控制、链表/二叉树操作,适配嵌入式底层、RTOS组件、设备链表管理场景;
物联网/车载嵌入式:补充字符串处理、数据解析、查找排序算法,适配串口/网络报文解析、传感器数据处理场景。
嵌入式刷题铁律:优先用 C 语言实现、严控空间复杂度(适配 MCU 小内存)、避免递归爆栈、拒绝冗余代码,全程贴合硬件开发思维。并且掌握一定的简单数据结构类型的算法。

二、嵌入式刷题前置准备:贴合硬件开发习惯
2.1 力扣平台适配设置(嵌入式专属)
1、语言必选C/C++:嵌入式岗位笔试全考C语言,禁止用Python刷题练手感,强制养成指针、内存操作习惯;
2、题库筛选逻辑:按「数组、链表、栈、字符串、二分查找」标签优先刷,避开复杂图论、高级动态规划(非嵌入式高频考点);
3、做题核心流程:读题析约束→考虑内存限制→写C语言代码→边界调试→复盘复杂度(尤其空间复杂度)。
2.2 嵌入式必备前置知识
刷题前必须掌握:C 语言指针、数组、结构体、内存操作(malloc/free)、循环/条件判断;理解时间/空间复杂度(嵌入式极端看重空间,O(1) 最优,杜绝 O(n) 以上空间浪费),熟悉栈溢出、内存泄漏等底层坑点。

三、嵌入式刷题教学:力扣真题
乐扣官方提供了非常多的算法题型,包括:数学、数组、链表、字符串、哈希表、双指针、递归、栈、队列、树、图与回溯算法、贪心和动态规划等。但是作为一名嵌入式工程师,日常开发中并不需要全部掌握。根据作者日常嵌入式工作的经验,作者推荐大家掌握:数组、哈希优化、栈、链表、双指针和二分法等。大家重点刷刷这类题型即可!
3.1 题型1:数组+哈希优化——两数之和(No.1,简单)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
嵌入式场景:传感器数据配对、寄存器地址匹配、串口指令校验
考点:数组遍历、指针操作、空间换时间(嵌入式小数据量适用)
/**
* Note: The returned array must be malloced, assume caller calls free().
* 嵌入式改法:改用静态数组,避免动态内存
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
// 静态内存,适配MCU小内存,禁止递归
static int res[2];
*returnSize = 2;
// 双层循环(嵌入式小数据量更稳定,避免哈希表占用内存)
for (int i = 0; i < numsSize; i++) {
for (int j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
res[0] = i;
res[1] = j;
return res;
}
}
}
return res;
}
嵌入式优化:改用双层循环替代哈希表,节省MCU内存;静态数组避免malloc泄漏;无递归,杜绝栈溢出。
3.2 题型2:栈应用——有效的括号(No.20,简单)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
3、每个右括号都有一个对应的相同类型的左括号。
嵌入式场景:串口报文校验、JSON/指令格式解析、设备通信帧校验
考点:栈操作、数组模拟栈、字符串遍历(嵌入式报文处理核心)
bool isValid(char * s) {
int len = strlen(s);
// 奇数长度直接返回,嵌入式快速判错
if (len % 2 != 0) return false;
// 静态栈,适配MCU,固定大小
char stack[10000];
int top = 0;
for (int i = 0; i < len; i++) {
if (s[i] == '(') stack[top++] = ')';
else if (s[i] == '{') stack[top++] = '}';
else if (s[i] == '[') stack[top++] = ']';
// 栈空或不匹配,帧错误
else if (top == 0 || stack[--top] != s[i]) return false;
}
return top == 0;
}
嵌入式优化:数组模拟硬件栈,无动态内存;提前判错,提升报文解析效率;适配串口帧实时校验场景。
3.3 题型3:单链表——反转链表(No.206,简单)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

嵌入式场景:设备链表管理、RTOS 链表操作、驱动节点逆序
考点:指针操作、链表逆序(嵌入式面试 Top1 考题)
struct ListNode {
int val;
struct ListNode *next;
};
// 迭代法,嵌入式首选,无栈溢出风险
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL;
struct ListNode *curr = head;
// 指针遍历,内存占用O(1)
while (curr != NULL) {
struct ListNode *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
嵌入式优化:迭代替代递归,彻底避免栈溢出;仅用 3 个指针,空间复杂度 O(1),完美适配 MCU;纯指针操作,贴合底层驱动开发。
3.4 题型4:双指针——移除元素(No.27,简单)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
1、更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
2、返回 k。
嵌入式场景:传感器数据滤波、无效数据剔除、数组内存整理
考点:双指针、原地修改(嵌入式内存紧缺必备)
int removeElement(int* nums, int numsSize, int val) {
int slow = 0;
// 原地修改,不开辟新数组,节省内存
for (int fast = 0; fast < numsSize; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
嵌入式优化:原地修改数组,空间复杂度 O(1);无内存拷贝,适配 MCU 低速主频;适配传感器脏数据过滤场景。
3.5 题型5:二分查找——二分查找(No.704,简单)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果 target 存在返回下标,否则返回 -1。
你必须编写一个具有 O(log n) 时间复杂度的算法。
嵌入式场景:寄存器地址查找、配置参数检索、Flash数据查表
考点:二分查找、有序数组检索(嵌入式查表核心)
int search(int* nums, int numsSize, int target) {
int left = 0, right = numsSize - 1;
while (left <= right) {
// 避免int溢出,适配MCU16位/32位寄存器
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
嵌入式优化:避免 mid 溢出,适配寄存器位数;循环迭代,无栈风险;查表速度快,适配 Flash 参数检索。
四、作者有话
作为一个名合格的嵌入式工程师来说,刷题不是为了应付算法竞赛,而是锤炼指针操作、内存优化、边界处理的底层能力,这些能力直接决定你写的代码会不会死机、报文会不会解析错误、内存会不会泄漏。坚持使用 C 语言慢慢积累自己的嵌入式代码功底是一件很值得培养的事情,想当年作者刷力扣也是磕磕绊绊的,如今简单刷法题手撕起来还是可以的。凡是贵在坚持,很多粉丝朋友私下和作者聊说刷了很久力扣,但是还是磕磕绊绊的怎么办?我只想说:熟能生巧,坚持下去!最后祝愿大家都能找到自己心仪的工作,Respect!

更多推荐
所有评论(0)