龙旗科技 - 驱动开发工程师 技术面

1. 请简单介绍一下你自己和你的技术背景

参考答案:(开放性问题,候选人应包含:教育背景、工作/项目经验、技术栈、个人优势等。面试官关注:表达能力、技术广度、与岗位匹配度)

2. 指针和引用在底层实现上有什么区别?引用的本质是什么?

参考答案:指针和引用在使用上有明显差异,底层实现也不同:

  • 指针: 是一个变量,存储内存地址可以为空(nullptr),可以重新赋值指向其他对象需要解引用操作符(*)访问值占用独立的内存空间(4或8字节)
  • 引用: 是对象的别名,必须在声明时初始化不能为空,不能重新绑定到其他对象直接使用,无需解引用底层实现:编译器通常用指针实现,但语义上是别名
  • 引用的值可以修改: 引用本身不能重新绑定,但引用的对象内容可以修改int& ref = a; ref = 10; // 修改a的值,而非重新绑定
  • 使用场景: 函数参数传递:引用避免拷贝且语法简洁返回值:引用可实现链式调用指针用于可选参数、动态内存、数据结构

3. const关键字有哪些用法?const修饰指针有几种情况?

参考答案:const表示常量,防止数据被修改:

  • 基本用法: 修饰变量:const int a = 10; 不可修改修饰函数参数:void func(const int& x) 防止函数内修改修饰成员函数:int getValue() const 承诺不修改成员变量修饰返回值:const int* getPtr() 返回的内容不可修改
  • 指针的四种情况:记忆技巧:const在左边修饰数据,在右边修饰指针本身
  • 编译期优化:const变量可能被编译器优化为立即数
  • 与#define区别:const有类型检查,有作用域,可调试

4. 描述一下你做过的项目,重点说明你负责的模块和技术难点

参考答案:(开放性问题,面试官应关注:项目规模、技术复杂度、个人贡献、问题解决能力、驱动相关经验。候选人应准备:项目背景、技术架构、核心功能、遇到的问题、解决方案、项目成果)

5. 手写快速排序算法,并说明其时间复杂度

参考答案:

#include <iostream>
using namespace std;

void quickSort(int arr[], int left, int right) {
    if (left >= right) return;
    
    int pivot = arr[left];  // 选择基准元素
    int i = left, j = right;
    
    while (i < j) {
        // 从右向左找小于pivot的元素
        while (i < j && arr[j] >= pivot) j--;
        if (i < j) arr[i++] = arr[j];
        
        // 从左向右找大于pivot的元素
        while (i < j && arr[i] <= pivot) i++;
        if (i < j) arr[j--] = arr[i];
    }
    
    arr[i] = pivot;  // 放置基准元素
    
    quickSort(arr, left, i - 1);   // 递归排序左半部分
    quickSort(arr, i + 1, right);  // 递归排序右半部分
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    quickSort(arr, 0, n - 1);
    
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    return 0;
}

  • 时间复杂度: 平均:O(n log n)最好:O(n log n)最坏:O(n²) - 数组已排序时
  • 空间复杂度:O(log n) - 递归栈
  • 优化:三数取中选择pivot、小数组用插入排序

6. 二叉树和链表有什么区别?如何实现单链表的反转?

参考答案:二叉树和链表都是链式存储结构,但组织方式不同:

  • 链表:线性结构,每个节点最多一个后继
  • 二叉树:树形结构,每个节点最多两个子节点
  • 应用场景:链表用于顺序访问,二叉树用于层次关系和快速查找

单链表反转实现:

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

// 迭代法
ListNode* reverseList(ListNode* head) {
    ListNode* prev = nullptr;
    ListNode* curr = head;
    
    while (curr != nullptr) {
        ListNode* nextTemp = curr->ne

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

xtu大迫杰:偶遇校友,祝校友offer打牌
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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