《嵌入式软件开发笔试与面试手册》:https://blog.nowcoder.net/zhuanlan/jvN8gj 《嵌入式软件笔试-2023年真题汇总》:https://blog.nowcoder.net/zhuanlan/0oDWVm 综合知识单选题(2分) 1.下面文于“单例模式”错误的是() A对于一些需要频繁创建和销的对象,单例模式可以提高系统的性能。 B它可以保证某个类在程序运行过程中最多只有一个实例,也就是对象实例只占用一份内存资源。 C使用单例,可以确保其它类只获取类的一份数据。 D由于单例模式中没有抽象层,因此单例很难进行类的扩展。 2.在 Linux中,使用什么命令来创建一个新的压缩归档文件() A compress -tf B gzip-t C tar -cfz D bzip2 -tbz 3.在支持多线程的系统中,隶属于同一个进程的多个线程不能共享的是() A进程所打开的文件 B进程的代码段 C进程的全局变量 D保存函数参数、返回地址等信息的堆栈 4.进程从运行状态进入就绪状态的原因可能是() A等待的事件已发生 B被选中占有处理机 C等待某一事件 D时间片用完 5.在Linux系统中,以下哪两个命令可以显示系统中运行的进程状态() A ps和df B ls和df C ps和top D df和top 6.耦合是影响软件复杂程度的一个非常重要的因素。进行软件程序设计时,耦合有一些基本原则需要遵循,遵循这些原则能够有助于设计出更加优秀的软件系统,下列选项中,关于这些原则描述错误的是() A耦合是无法彻底避免的,在实际使用中,应该尽量使用数据耦合 B在实际使用中,要尽量多使用内容耦合,原因是内容耦合是较低程度的耦合 C尽量少使用控制合和特征耦合 D要尽量限制公共环境耦合的范围 C++基础2分 1.STL中的unordered_map和priority_queue使用的底层数据结构分别是什么() A rbtree,heap B rbtree,queue C hashtable,heap D hashtable,queue 2.C++11中有一个非常大的变化就是引入了三种智能指针,下列选项中,属于这三种智能指针正确组合的是() A std::shared ptr、std:weak_ptr和std:unique ptr B std:shared_ptr、std:stick_ptr和std::unique ptr C std:shared_ptr、std:weak_ptr和std::future ptr D std:set_ptr、std:weak_ptr和std::unique_ptr 3.下列哪个查找最快() A二分查找 B 哈希表法(散列表) C 顺序查找 D二叉排序树查找 4.下面C++程序的运行结果为() #include <iostream>using namespace std;int solve(int x) { if (x == 0 || x == 1) { return x; } if (x % 2 == 0) { return 1 + solve(x / 2); } else { return 1 + solve((x + 1) / 2); }}int main() { int n = 100; int ans = solve(n); cout << ans << endl; return 0;} A 8 B 6 C 7 D 9 5.归并排序相对于快速排序的优点不包括() A空间复杂度低 B是稳定的 C最坏的情况更高效 D不会退化 6.栈的特点是先进后出。栈底至栈顶依次存放元素ABCD,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是() A DBCEA B DCBEA C DEBCA D DCAEB 7.在具有2n个结点的完全二叉树中,叶子结点个数为() A n-1 B n C n+1 D n/2 8.抽象基类是指() A含有纯虚函数 B嵌套类 C派生类 D多继承类 9.有关广度优先搜索 (Breadth-first Search)和深度优先搜索 (Depth-first Search),以下说法中正确的是:() A 在解决最短路径问顾时,Dikstra算法 (Dikstra's algorithm)本质上是一种考虑了边(Edge)的权重的深度优先搜索。 B广度优先搜索和深度优先搜索都可以用于遍历一棵树。 C在解决迷宫问题时,深度优先搜索总会比广度优先搜索更快地找到迷宫出口。 D广度优先搜索需要在搜索的每一层保存该层的所有结点,这一操作只能用队列这种数据结构来完成。 10.求一个数x的n次方最朴素的方式是在1的基础上乘n次x,如果用递归,显然会执行n次递归函数,时间复杂度为O(N)。不过可以通过对n的奇偶性判断来加大递归步长,每次可将范围减半,即如果n是偶数,那么x^n =x^(n/2)*x^(n/2),下面的函数是实现了这个过程的完整代码,它的时间复杂度为() int pow(int x, unsigned int n){ if (n == e) return 1; if (n & 1) return pow(x, n/2)* pow(x,n / 2)*x; else return pow(x, n/ 2)* pow(x, n / 2);} A O(N*log(N)) B O(logN) C O(N) D O(N^2) 11.已N有向图G=(VE).其V={a,b,e,d,e,r,g}, E={<a,b>,<a,c>,<a,d>,<b,e>,<c,e>,<c,f>,<d,f>,<e,g>,<f,g>}则图G的拓扑序列是() A a,c,d,e,b,f,g B a,c,d,t,b,e,g C a,c,b,6,d,e,g D a,b,e,c,d,f,g 12.C++中static类型的变量,默认的初始化值是() A 1 B 0 C空格符 D随机变量 13.数组与链表的区别是() A两者长度均固定 B前者长度固定,后者长度可变 C后者长度固定,前者长度可变 D两者长度均可变 14. char a; int b; float c; double d; 则表达式a*b+d-c值的类型为() A char B float C int D double 简答10分 1.vevtor push_back的时间复杂度是多少?在已知 vector容量前提下,如何避免额外的开销,提升 vector push_back 性能? 通常情况下,push_back 的操作是常数时间复杂度(O(1))。这是因为 std::vector 通常预留一定的空间来存储额外的元素,所以大多数 push_back 操作只涉及将新元素放置在这个预留空间中。 当 vector 的容量已满时,进行 push_back 操作需要扩容,这涉及到分配新的更大的内存空间,并将所有现有元素复制(或移动)到新的内存地址。这个操作的时间复杂度是线性的(O(n)),因为它依赖于 vector 当前的元素数量。 使用 std::vector::reserve() 方法。这个方法允许你指定 vector 的容量,这