《嵌入式软件开发笔试与面试手册》:https://blog.nowcoder.net/zhuanlan/jvN8gj 《软件开发笔试汇总》:https://blog.nowcoder.net/zhuanlan/0oDWVm VIVO笔试每年仅一场 单选题 1.使用SQL语言查询选修"JAVA编程"课程的学生学号和成绩,以下正确的是? A SELECT学号,成绩FROM选修WHERE 课程号IN(SELECT课程号 FROM课程WHERE 课程名='JAVA编程'); B SELECT学号,成绩FROM课程,选修LIKE课程,课程号=选修,课程号AND课程,课程名='JAVA编程'; C SELECT学号,成绩FROM选修JOIN课程IN选修,课程号=课程,课程号WHERE课程名='JAVA编程'; D SELECT学号,成绩FROM课程,选修WHERE 课程,课程号=选修,课程号OR课程,课程名='JAVA编程' 2.对于带宽为2000Hz的低通信道,采用16种不同的物理状态来表示数据,信噪比为20dB,按照奈奎斯特定理,信号速率是? A 32kb/s B 320kb/s C 128kb/s D 16kb/s 解释: 最大数据传输速率=2×带宽×log2(符号数) 2×2000×log2(16) = 16000 bps = 16kbps 3.一个容量为16K×32位的存储器,其地址线和数据线的总和是多少? A 36 B 48 C 46 D 32 解释: 计算地址线数量 16K意味着存储器有 16K(即 16,384)个存储位置。 log2(16384)=14 计算数据线数量 每个存储位置是 32位,所以存储器接口需要 32 根数据线来读写这 32位数据。 4.发生死锁的必要条件有四个,要避免死锁的产生,可以打破这四个必要条件,但打破___条件是不太实际的。 A不可剥夺 B互斥 C禁止加锁 D循环等待 解释: 互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程可以使用它。 持有并等待:一个进程必须正在持有至少一个资源,并等待获取额外的被当前其他进程持有的资源。 不可剥夺:资源只能由持有它的进程释放,不能被强制剥夺。 循环等待:必须有一个进程-资源的闭环链,其中每个进程至少持有一个资源,该资源被链中下一个进程所请求。 打破不可剥夺这一条件意味着如果一个进程占用了某些资源,系统可以选择强制该进程释放资源,以便分配给其他进程。在许多实际系统中,特别是涉及硬件操作或具有高稳定性和安全需求的环境中,强制剥夺资源可能会导致状态不一致或数据损坏,因此这通常是不太实际的。 5.下列哪个数据结构可以用于实现LRU缓存? A队列 B哈希表 C链表 D栈 解释: LRU(Least Recently Used)缓存是一种常见的缓存淘汰策略,用于维护一个固定大小的数据结构,其中最近最少使用的数据项会首先被淘汰。实现LRU缓存通常需要快速地插入数据、删除数据以及更新数据的访问时间。 6.以下不属于软件架构三要素之一的是? A组件间明确的关联关系 B 职责明确的模块或者组件 C约束和指导原则 D对外提供业务处理能力的服务 不定项选择题 1.下列哪些是数组的特点? A随机访问 B插入删除复杂度O(1) C连续的内存空间 D动态调整大小 D存储相同类型的数据 解释: B在数组中插入或删除元素通常不是 O(1) 操作,除非是在数组的末尾进行操作(如在动态数组中)。在数组中间或开始插入或删除元素通常需要移动后续的元素来维护连续的存储,这通常是 O(n) 的时间复杂度。 2.关于数据库索引,以下说法正确的是: A Hash索引能支持精确查找和范围查找 B树索引支持大于小于等于查找,范围查找 C Hash索引不支持数据的排序和分组 D Hash索引能以O(1)时间进行查找 解释: Hash索引非常适合精确查找,因为它们通过哈希表实现,可以在理想情况下以 O(1) 时间复杂度进行数据访问。然而,Hash索引通常不支持范围查找,因为哈希函数的输出不保留元素间的逻辑顺序,使得它们不适用于执行大于、小于这类基于范围的查询操作。 3.下列哪些是编码实现中的常见问题? A变量命名不规范 B缺少注释 C代码重复 D数据库设计不合理 E可读性差 4.下列哪些是栈和队列的基本操作? A查找 B遍历 C删除 D取出 E插入 解释: A查找操作通常不是栈和队列的基本操作。栈允许访问顶部元素,而队列允许查看首部和尾部元素,但这些都不涉及一般意义上的查找操作。 B虽然栈和队列可以被遍历,但遍历通常不是这两种数据结构的基本操作。基本操作更侧重于元素的添加和删除。 编程题(核心代码模式) 第一题 预测时长的计算方法 在XR (Extended Reality,扩展现实)产品架构中,延时是最关键的因素。XR工作流中有一个视觉处理系统,每33ms,摄像头固定曝光exposure—次产生一帧图像,由ISP (lmage Signal Processor,图像处理器)处理,并传输给算法系统。摄像头的ISP处理时间是duration1,少于33ms,大于10ms;算法系统的处理时间是duration2,少于33ms,大于10ms。由于系统并非实时系统,"ISP处理"和"algorithm 算法处理"都存在未知的时间波动x, duration1+duration2可能高于33ms。 你将设计一个预测系统,由摄像头的曝光结束时刻t0开始,控制算法结果获取的时刻t0+toffset。使得: 获取算法结果时,如果算法还没有处理完,则产生了掉帧,预测系统保证掉帧率在2%以下; 从曝光到算法结果获取,时间尽可能地短,预测系统需要优化这个时间,达到满足掉帧率的情况下最短。 你将获得各步骤"exposure, isp, algorithm "时间戳的50个历史记录。编写一个函数给出toffset一个最优预测时长。 输入 int tsExpsureEnd[50];//timestamp of expsure ending, t0 int tslspEnd[50];//timestamp at end of isp process int tsAlgorithmEnd[50];//timestamp at end of algorithm process 提供三个时间戳数组(单位ms)。输入格式为三个数组打印的字符串。时间戳以","逗号分割,数组间以“”空格分割,顺序是 tsExpsureEnd tslspEnd tsAlgorithmEnd 输出 int toffset; //time offset (begin with tsExpsureEnd)for gettingalgorithm results. 示例1 输入 "305,338,371,404,437,470,503,536,569,602,635,668,701,734,767,800,833,866,899,932,965,998,1031,1064,1097,1130,1163,1196,1229,1262,1295,1328,1361,1394,1427,1460,1493,1526,1559,1592,1625,1658,1691,1724,1757,1790,1823,1856,1889,1922" "316,356,393,423,464,482,533,564,601,612,647,695,712,748,792,820,847,880,917,945,987,1016,1050,1095,1121,1151,1174,1225,1245,1294,1313,1341,1375,1424,1453,1480,1523,1557,1583,1619,1650,1690,1714,1736,1788,1800,1852,1883,1915,1935" "327,380,423,436,482,512,547,580,613,638,678,721,734,767,815,852,873,900,947,964,1016,1042,1071,1118,1140,1182,1197,1243,1274,1306,1329,1356,1401,1441,1480,1509,1551,1576,1607,1651,1669,1705,1734,1754,1810,1829,1873,1894,1925,1953" 输出 58 #include <iostream>#include <vector>#include <algorithm>#include <sstream>using namespace std;int calculateOptimalOffset(const string& tsExposureEndStr, const string& tsIspEndStr, const string& tsAlgorithmEndStr) { vector<int> tsExposureEnd; vector<int> tsIspEnd; vector<int> tsAlgorithmEnd; stringstream ssExp(tsExposureEndStr); stringstream ssIsp(tsIspEndStr); stringstream ssAlg(tsAlgorithmEndStr); int temp; char delim; while (ssExp >> temp) { tsExposureEnd.push_back(temp); if (ssExp.peek() == ',') ssExp >> delim;