分享丨深圳元戎启行科技有限公司测开岗面试经验(未通过)
2855
2024.08.15
2024.09.06
发布于 北京市

岗位:测试开发,主要做台架测试
面试流程:3轮面试+hr面
一轮面试(8.15上午11点,下午3点反馈通过)
二轮面试(8.16下午2点,8月19号反馈通过)
三轮面试(8.20下午3点,8.26反馈面试已过)
四轮hr面试(8.27下午4点,9.3晚上告知不推进,原因估计有个更好的人选和相匹配的薪资)

下面的面试答案部分来源网络收集

一轮面试题

  1. python的内置数据类型有哪些?(数字,字符串,列表,字典,集合)

  2. 这些的数据类型哪些是可变的,哪些是不可变的?(可变:列表,字典,集合,不可变:数字,字符串和元组)

  3. 远组在什么情况下是可修改?什么情况下是不可修改?(元组中包含的元素是可变对象,例如列表,虽然不能改变元组本身,但是可以通过修改其内部的可变对象来间接改变远组的内容 如tup=(1,[2,3]) tup[1].append(4);如果里面的元素为不可变对象,则不可以修改)

  4. 用过python的那些内置库?(math,random,os,json,collections,itertools,numpy等)

  5. 入如果想看这些标准库的代码,他的路径是?(一般在python安装目录下的lib文件夹下)

  6. python运行中时如何获取到这个库的路径?(解释器一般按照系统中列出的路径来搜索所需要的库,先查当前脚本所在路径,在看环境变量路径,最后去python安装目录下lib目录下的标准库找)

    也可以用下面代码方式来了解具体的路径信息
    import sys
    for path in sys.path:
        print(path)
  7. 装饰器的返回是什么?(返回是函数,接受一个函数做为参数,并返回一个新的函数)

  8. 怎么用装饰器统计被调的函数的次数?()

  9. python是多继承还是单继承?(python支持多继承,一个类可以有多个父类,通过多继承,获取父类的方法和属性)

  10. A继承B,B继承C,C继承D,如何查看A的超类有哪些?(使用A.__bases__来查看它的超类,有的话返回一个元组;A.__mro__来获取属性继承顺序)

  11. python多线程和多进程在高并发下有什么优缺点?

  • 多线程优点:
    • 1.线程间切换开销小,可以共享相同的内存,
    • 2.数据共享容易,多线程可以直接访问和修改共享数据,
  • 多线程缺点:
    • GIL限制,因为python的全局解释锁使得在同一个时刻只有一个线程执行字节码,意味多核情况下无法真正实现并行计算,性能提升有限
  • 多进程优点:
    • 可以真正的利用多核CPU,在CPU密集型任务中显著提高性能。
    • 进程之间相互独立,一个进程的崩溃不会影响其他进程。
  • 多进程缺点:
    • 进程间通信和数据共享复杂,通常需要特定的机制,如进程间通信管道、共享内存
    • 进程创建和切换的开销比线程大。
  1. python进入全局解释器锁的原因?

    1. 保证数据的一致性和内存管理,因为python的内存管理不是线程安全的,GIL确保在同一个时刻只有一个线程在执行Python字节码,避免多线程并发访问内存时可能出现的数据不一致和错误;
    2. 就是简化C扩展,因为许多python库和扩展是用C语言编写,GIL简化了C扩展与python解释器的集成,降低开发维护的复杂性
    3. 单线程性能,早期python主要用于单线程任务。GIL在单线程情况下对性能影响小,甚至可能有一定的优化效果
  2. python内置环境在什么情况下需要引入这个数据一致性?

    1. 多线程操作共享数据结构:当多个线程同时访问和修改同一个列表、字典或者其他可变元素时,如果不加以适当同步措施,可能会出现数据不一致
    2. 并发文件操作:如果多个线程或者进程对同一个文件进行读写,可能会导致文件内容不一致
    3. 全局变量修改:多个线程同时修改全局变量的值时,可能会出现不可预测的结果,需要确保数据一致性。
    4. 数据库操作:在使用python的数据库接口,像sqlite3进行数据并发数据库操作时,需要注意数据一致性
    5. 网络编程中的共享状态:在多线程或多进程网络编程中,共享的状态信息需要保证一致性
  3. python中多协程和多线程有什么优缺点?

    1. 多线程优点:编程模型简单,适用于I/O密集型任务, 缺点受GIL限制,无法充分利用多核优势,线程切换存在开销,线程间同步和数据共享较为复杂。
    2. 多协程的优点: 内存占用少,因为协程的切换通常只涉及寄存器的操作,而不需要操作系统的参与;不受GIL限制,可以在单线程内实现并发,适用于高并发场景;切换开销极小,比线程切换更快。
      多协程的缺点:1.编程模型相对复杂,需要对异步编程有较深入的理解。2.依赖于事件循环和回调机制,代码可读性可能受到一定影响。3. 对于一些复杂的同步逻辑,实现起来可能较为困难。
  4. 了解过哪些python的编程规范?

    1. 以下是一些常见的 Python 编程规范要点:缩进:使用 4 个空格进行缩进
    2. 变量和函数命名:采用具有描述性的小写字母和下划线组合,例如 my_variable、my_function 。
    3. 每行代码长度:尽量避免一行代码过长,通常不超过 80 个字符。
    4. 注释:使用适当的注释来解释代码的功能和逻辑,增强可读性。
    5. 函数和类的组织:相关的函数和类应该放在一起,并且按照逻辑顺序排列。
    6. 空行的使用:在函数之间、类的方法之间适当添加空行,以提高代码的清晰度。
    7. 异常处理:合理使用 try-except 语句来处理可能出现的异常情况。
    8. 模块导入:尽量将模块导入放在文件的开头。
    9. 代码风格一致性:在整个项目中保持一致的编程风格。)

Linux

  1. 查找某一个文件,只知道在home路径下但是不知道其具体路径,通过Linux命令查找出来(find /home -name “file.txt” 2>dev/null 2>dev/null用于将错误输出重定向到/dev/null 避免显示过多错误信息)
  2. 查找制定文件中的某个关键词(grep “关键词” file.txt 如果需要忽略大小写 加-i)
  3. ubuntu系统的/etc目录和/tmp目录下存放的是什么?
    1. /etc下是系统配置文件存放位置,包含网络配置,服务配置等,用户和组的配置,软件包的配置
    2. /tmp存放临时文件,通常有较短的生命周期,系统可能会定期清理其中的一段时间未被访问或使用的文件,释放磁盘空间
  4. 自动驾驶的硬件通信协议?(CAN、Ethernet、FlexRay、LIN、SPI、I2C、DDS)
  5. CAN了解嘛?说一下CAN的协议规则?(多主通信:多个节点可同时发送消息,通过标识符来决定消息发送优先级;非破坏性仲裁:多个节点同时发送消息时,较低标识符(优先级更高)的消息会优先发送,其他节点会自动停止发送并等待;短帧结构:标准帧包含11位标识符和最多8个数据字节,扩展帧包含29位标识符和最多8个数据字节,错误检测和处理:具有多种错误检测机制,如位错误,填充错误,CRC错误等,数据传输速率:常见的传输速率125kbps,250kbps,500kbps,实时性:能够满足对实时性要求比较高的应用场景)
  6. CAN通信总线的一个电阻大概是多少欧姆?(120欧姆)
  7. shell脚本,实现给一个指定的文件夹下面所有文件加一个日期?
    #!/bin/bash
    
    folder="/your/folder/path"  # 将此路径替换为您的实际文件夹路径
    
    for file in "$folder"/*
    do
        if [ -f "$file" ]; then  # 确保是文件而不是目录
            date=$(date +%Y%m%d)
            new_name="${file%.*}_${date}.${file##*.}"
            mv "$file" "$new_name"
        fi
    done
    上面代脚本保存为 .sh文件(如:add_date.sh),并增加执行权限(chmod +x add_date.sh)

coding(牛客网在线编程题链表中环的入口结点,类似leetcode141环形链表

给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
数据范围: n <= 10000,1<= 结点值 <= 10000
要求:空间复杂度 O(1),时间复杂度 O(n)
image.png

下面方法一个答案,可以解决上面两个题

class Solution:
    # 判断有没有环,返回相遇的地方
    def EntryNodeOfLoop(self, pHead: ListNode):
        slow = self.hasCycle(pHead)
        # 没有环
        if slow == None:
            return None
        # 快指针回到表头
        fast = pHead
        # 再次相遇即是环入口
        while fast != slow:
            fast = fast.next
            slow = slow.next
        return slow

    # leetcode 144题 把相遇的地方改成返回True即可
    def hasCycle(self, head):
        # 先判断链表为空的情况
        if head == None:
            return None
        # 快慢双指针
        fast = head
        slow = head
        # 如果没环快指针会先到链表尾
        while fast and fast.next:
            # 快指针移动两步
            fast = fast.next.next
            # 慢指针移动一步
            slow = slow.next
            # 相遇则有环
            if fast == slow:
                # 返回相遇的地方
                return slow
        # 到末尾则没有环
        return None

class Solution:
    # 判断有没有环,返回相遇的地方
    def EntryNodeOfLoop(self, pHead: ListNode):
        fast =pHead
        slow = pHead
        while True:
            # fast指针走过链表末尾,说明无环,返回None
            if not fast or not fast.next:
                return None
            slow = slow.next
            fast = fast.next.next
            if slow is fast:
                break
        # 第二次相遇,fast回到链表起点
        fast = pHead
        # fast和slow没相遇时候各走一步
        while slow != fast:
            fast = fast.next
            slow = slow.next
        # 再次相遇即slow所在节点
        return slow

二轮面试题

  1. 自动驾驶有哪些模块呢,讲一讲?(感知,定位,决策,规划,控制,数据存储与处理等,展开细节)

  2. 硬件信号有传感器,超声波,毫米波,激光雷达,那这些是怎么传输给感知的?
    硬件信号如传感器、超声波、毫米波、激光雷达等传输给感知系统的过程通常包括以下步骤:
    首先,这些硬件设备会对周围环境进行监测和测量,捕捉到相应的物理信号。例如,传感器会感知温度、压力、位置等信息,激光雷达会测量距离和物体形状。
    然后,这些设备将捕捉到的原始信号转换为电信号或数字信号。
    接下来,通过特定的接口和通信协议,如 CAN 总线、以太网等,将这些信号传输到处理单元。
    在处理单元中,会对这些信号进行预处理,包括滤波、放大、数字化等操作,以提高信号的质量和可用性。
    经过预处理后,利用专门的算法对这些信号进行分析和解读,提取出有用的信息,如物体的位置、速度、形状等,从而实现对环境的感知。

  3. 激光雷达是通过怎么样的协议传输给域控制器?(UDP/IP协议或CAN接口)

  4. 就针对超声波、毫米波是不是都会用到 can FD 和以太网这两个协议?
    超声波和毫米波雷达不一定都会用到 CAN FD 和以太网这两个协议。
    CAN FD 协议在汽车领域应用较为广泛,一些车载毫米波雷达和超声波雷达可能会使用 CAN FD 来传输数据,但并非所有的都会采用。
    以太网协议具有高带宽、低延迟等优点,但由于成本和复杂性等因素,不是所有的超声波和毫米波雷达都一定会使用以太网来传输数据。
    具体使用哪种协议,取决于多种因素,如产品设计、成本考量、系统要求等。在很多情况下,一些较简单的超声波雷达可能会使用相对简单和低成本的通信方式,而一些高端、对数据传输要求较高的毫米波雷达可能会倾向于使用以太网或更先进的通信协议。

  5. 自动驾驶公司中常用的一些车辆的预控制器,你了解哪些?

  6. 项目这里面这个产品就你测试的部分,最后交付给客户是一个什么样的一个形式?硬件还是软件?

  7. HIL如何测试?(因为没有做过,讲了一下自己了解的步骤)

  8. SIL测试方案组成?
    如果是针对自动驾驶的 SIL(Safety Integrity Level,安全完整性等级)测试方案,通常由以下几个主要部分组成:

    1. 需求分析:
      • 明确自动驾驶系统的安全要求和功能需求。
      • 确定需要达到的 SIL 等级。
    2. 测试策略制定:
      • 选择合适的测试方法,如模拟测试、硬件在环测试、实车道路测试等。
      • 规划测试的覆盖范围,包括不同的驾驶场景、环境条件和故障模式。
    3. 测试环境搭建:
      • 准备所需的硬件设备,如传感器模拟装置、控制器、执行器等。
      • 建立软件模拟平台,用于模拟车辆行驶环境和各种工况。
    4. 测试用例设计:
      • 基于风险分析和故障模式,设计全面的测试用例。
      • 涵盖正常操作、异常情况和故障条件下的系统响应。
    5. 测试执行与监控:
      • 按照设计的测试用例进行实际测试。
      • 实时监控测试过程中的系统性能和输出数据。
    6. 数据分析与评估:
      • 收集和分析测试过程中产生的数据。
      • 评估系统的安全性和可靠性是否达到预定的 SIL 等级要求。
    7. 测试报告编制:
      • 总结测试结果,包括通过的测试用例和发现的问题。
      • 提出改进建议和后续的测试计划。
    8. 风险评估与管理:
      • 识别测试过程中可能出现的风险,并制定相应的应对措施。
    9. 质量保证与审核:
      • 确保测试过程和结果符合相关标准和规范。
      • 进行内部审核和外部认证,以验证测试的有效性和可靠性。
  9. 仿真场景可以有哪些软件生成?(底层用的unity来写的模拟器)

  10. 自动驾驶仿真场景如何创建到最终生成的过程?

开放性题目

领导安排你做一项工作,我们不说具体是什么样的工作,你就是说按照你的工作经验理解做一件事情要分哪步骤?

coding

  1. 新建一个 reverse 函数和主函数,主函数调用 reverse 并传入一个字符串,要求 reverse 函数将输入的字符串反转并返回。最终主函数打印反转后的字符串。例如,输入字符串 hello 反,然后 olleh。

    def reverse_string(s):
        return s[::-1]
    
    string = input("请输入一个字符串: ")
    reversed_string = reverse_string(string)
    print("反转后的字符串: ", reversed_string)
  2. (多线程)

    需求背景:提供一个程序,固定周期输出10个ID,要求10个线程,每个线程不同周期打印不同ID。比如线程1每sleep 1ms打印一次"1",线程2每sleep 2ms打印一次"2"。

    1. 代码实现上述需求
    2. 描述这样使用多线程实现需求有什么优劣?
    3. 投入使用后需要增加到1万个ID。如果使用1万个线程就存在打印的周期不稳定的情况比如线程1实际上是1.2ms打印一次1,线程2是2.4ms打印一次2,请为该程序提供优化办法让1万个ID的周期变得稳定。
        

三面

  1. 前面的面试官说你线程和进程概念不是很理解,现在有什么新的看法吗?
  2. 之前内部写的一部分东西因为是单线程㝍的,所以我们需要把它转换成多线程,所以不是形成而上?
  3. 如何评判自动驾驶的感知系统做的好不好?你之前也做过地图点云相关的工作,可以尝试回答一下?感知如何使用这个点云数据?
  4. lidar的成像原理和为什么会产生鬼影?(发生激光脉冲,测量这些脉冲从发射到被物体反射回来所经历的时间,来计算物体与传感器之间的距离,鬼影是因为激光脉冲传播过程中遇到反射或折射,导致传感器收到错误的反射信号,产生虚假物体或者位置偏移,看起来像鬼影)
  5. 基于点云的一些特性,基于它的使用目的,你怎么评判一个感知系统,假设我们现在用的是360度点云,我们用它来做物体、车辆、行人检测,怎样评价这个检测系统做的好不好?或者说怎么评价一个感知系统,它用这个雷达数据的结果,他做的是好还是不好?好的话是有多好,怎么样去以一个指标化、定量化的方式来评判它的效果?(定量化的指标说了准召率和F1;帧率:每秒系统处理的帧数;检测距离和分辨率;漏检率误检率)
  6. 其实过得半小时,我在不断地一步一步往前探索,问了你怎么评判感知系统做的好不好,你能给我一个标准化的回答已经很好了,只是呢,我想在这上面更进一步,个方位的漏检误检会导致怎么样的后果?所以我继续问的一个问题,应该对所有的漏检误检一视同仁吗?(面试官说了如何是当前车道前方有个障碍物漏检可能会导致车毁人亡,如果是本车道误检可能造成的是急刹车,连环追尾,如果是旁边车道漏检误检,可能变道碰撞,人还有活着的可能性,对车辆和人员造成不同程度的伤害)
  7. 你有想过感知的结果是好还是不好?应该是由规划决定的,或者说应该由控制来决定,就是它仅仅是一个模块,它最终是为了自动驾驶服务的,而自动驾驶最终呈现是靠规划控制,有想过这个可能性吗?
  8. 职业规划是什么?
评论 (1)