嵌入式必备基础手撕算法

一、数组与指针基础(必考)

1. 数组反转

考察点:指针、边界、原地操作

void reverse(int *arr, int n)
{
    int l = 0, r = n - 1;
    while (l < r) {
        int tmp = arr[l];
        arr[l] = arr[r];
        arr[r] = tmp;
        l++;
        r--;
    }
}

这些问题在嵌入式八股文专栏都涵盖了。

全网最全面的嵌入式八股文专栏:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk

2. 查找最大 / 最小值

int max(int *a, int n)
{
    int m = a[0];
    for (int i = 1; i < n; i++)
        if (a[i] > m) m = a[i];
    return m;
}

3. 删除数组中的指定元素(原地)

int remove_val(int *a, int n, int val)
{
    int k = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] != val)
            a[k++] = a[i];
    }
    return k;  // 新长度
}

二、字符串处理(嵌入式最常考)

4. 手写 strlen

int my_strlen(const char *s)
{
    int len = 0;
    while (*s++) len++;
    return len;
}

5. 手写 strcpy

char *my_strcpy(char *dst, const char *src)
{
    char *ret = dst;
    while ((*dst++ = *src++));
    return ret;
}

6. 判断字符串是否为回文

int is_palindrome(const char *s)
{
    int l = 0, r = my_strlen(s) - 1;
    while (l < r) {
        if (s[l++] != s[r--])
            return 0;
    }
    return 1;
}

三、排序算法(手撕首选)

7. 冒泡排序

void bubble_sort(int *a, int n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (a[j] > a[j+1]) {
                int t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
}

8. 插入排序(嵌入式很爱)

void insert_sort(int *a, int n)
{
    for (int i = 1; i < n; i++) {
        int key = a[i];
        int j = i - 1;
        while (j >= 0 && a[j] > key) {
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = key;
    }
}

四、链表(嵌入式面试核心)

9. 单链表反转(必背)

struct node {
    int data;
    struct node *next;
};

struct node* reverse_list(struct node *head)
{
    struct node *prev = NULL;
    struct node *cur = head;

    while (cur) {
        struct node *next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

10. 判断链表是否有环(快慢指针)

int has_cycle(struct node *head)
{
    struct node *slow = head, *fast = head;
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast)
            return 1;
    }
    return 0;
}

五、栈与队列(RTOS / 驱动常考)

11. 用数组实现栈

#define MAX 100
int stack[MAX];
int top = -1;

int push(int x)
{
    if (top == MAX - 1) return -1;
    stack[++top] = x;
    return 0;
}

int pop(int *x)
{
    if (top == -1) return -1;
    *x = stack[top--];
    return 0;
}

12. 循环队列判空 / 判满

// 空:front == rear
// 满:(rear + 1) % N == front

六、位运算(嵌入式特色)

13. 判断奇偶

int is_odd(int x)
{
    return x & 1;
}

14. 统计二进制 1 的个数

int count_ones(unsigned int x)
{
    int cnt = 0;
    while (x) {
        x &= (x - 1);
        cnt++;
    }
    return cnt;
}

15. 不用临时变量交换两个数

void swap(int *a, int *b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

七、递归基础(适度)

16. Fibonacci(面试会问优化)

int fib(int n)
{
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2);
}

面试官真正想看什么?

  1. 指针是否安全
  2. 边界条件是否完整
  3. 时间 / 空间复杂度意识
  4. 是否贴合嵌入式场景(不用 STL、不用递归乱开栈)
  5. 代码风格是否工程化

全部评论
摸透了面试官呀哈哈
点赞 回复 分享
发布于 2025-12-28 15:42 广东
@已注销
点赞 回复 分享
发布于 2025-12-23 10:59 北京
爱信等
点赞 回复 分享
发布于 2025-12-23 10:51 北京
mark
点赞 回复 分享
发布于 2025-12-23 10:51 北京

相关推荐

2025-12-16 13:15
门头沟学院 Java
1.你对图数据库有了解么?介绍一下2.你项目里为什么一定要用netty呢3.我现在有10wTPS&nbsp;的秒杀接口,用Redisson实现了锁,但线上经常出现锁未释放排查发现是watchdog机制失效,你觉得这种情况该如何彻底解决4.你觉得一定要使用分布式锁解决幂等么,不加这个锁可不可以5.你觉得数据库的行锁和Redis分布式锁或者zk的锁有什么区别6.性能?你觉得行锁性能一定会比分布式锁差么7.线上观察到&nbsp;GC&nbsp;日志里出现了这样一条&nbsp;Full&nbsp;GC&nbsp;日志:[Full&nbsp;GC&nbsp;(Ergonomics)&nbsp;[PSYoungGen:&nbsp;65536K-&gt;0K(76288K)]&nbsp;[ParOldGen:&nbsp;1750000K-&gt;1750000K(1750000K)],你能不能不靠任何工具,手动推断出这个进程可能的内存配置,以及这次GC的本质问题8.如果你们在业务高峰期观察到&nbsp;Eden&nbsp;区被频繁触发&nbsp;GC,但实际对象存活率很低,你怎么看9.我们一个Kafka&nbsp;topic&nbsp;被&nbsp;5&nbsp;个消费组同时消费,每个&nbsp;group&nbsp;负责写不同系统。中间某个group偶发失败,但你不能重放整条消息(因为另外几个已经成功),你怎么保证这组失败消息能精准重试?还能保证幂等?10.手撕:给你一个数组,它里面的元素呢都是正整数。再给你一个目标值,要求就是你在这个数组里面找到这个子数组和要大于等于这个目标值,然后返回结果是返回子数组的最小长度。
查看10道真题和解析
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务