今天给大家分享一些小米公司的嵌入式软件开发工程师的笔试题目,共分为选择题、编程题两大部分(目录如下)。
这份题目很奇怪,操作系统、数据结构、网络基础、Java、C++、数据库、正则表达式、Linux全都考到了。记得当初在做题的时候,我都怀疑发错卷子了……还好最后两道大题都做了出来,否则很容易就挂了。
- 选择题
- 专项选择题
- 编程题1(字符串筛选)
- 编程题2(字符串有效判断)
选择题
1、已经获得除CPU以外的所有所需资源的进程处于()状态:
A 就绪状态
B 阻塞状态
C 运行状态
D 活动状态
A
进程的五状态模型:
运行态:该进程正在执行。
就绪态:进程已经做好了准备,只要有机会就开始执行。
阻塞态(等待态):进程在某些事情发生前不能执行,等待阻塞进程的事件完成。
新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是进程控制块已经创建但是还没有加载到内存中的进程。
退出态:操作系统从可执行进程组中释放出的进程,或由于自身或某种原因停止运行。
2、某二叉树的中序遍历序列为32145,后序遍历序列为32145,则前序遍历序列为:
A 54123
B 32154
C 32541
D 54321
A
二叉树的中序遍历序列为 32145 ,后序遍历序列为32145 ,可知该树只有左子树结点,没有右子树结点, 5 为根结点。
中序遍历序列与后序遍历序列相同,说明该树只有左子树没有右子树,因此该树有 5 层,从顶向下依次为54123 。
3、若已知一个栈的入栈顺序是1,2,3...,n,其输出序列为P1,P2,P3,....Pn,若P1是n,则Pi=()?
A i
B n-i+1
C 不确定
D n-i
B
栈的排列遵循先进后(即后进先出)出的原则
因为P1是n,是出栈的第一个数字,说明在n之前进栈的数字都没有出栈。所以这个顺序是确定的。
还可以知道,最后出栈的一定是数字1,也就是Pn。代入这个式子,是正确的。
4、(多选题)下面协议中属于应用层协议的是:
A ICMP、ARP
B FTP、 TELNET
C HTTP、SNMP
D SMTP、POP3
BCD
1、物理层:以太网 、 调制解调器 、 电力线通信(PLC) 、SONET/SDH 、 G.709 、 光导纤维 、 同轴电缆、 双绞线等。
2、数据链路层:Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16) 、ATM 、 DTM 、 令牌环 、以太网、FDDI、 帧中继、 GPRS 、 EVDO、HSPA 、HDLC 、 PPP 、 L2TP 、PPTP 、ISDN·STP、CSMA/CD等。
3、网络层协议:IP IPv4 、IPv6、 ICMP、ICMPv6·IGMP、IS-IS 、IPsec 、ARP 、RARP 、RIP等。
4、传输层协议:TCP、 UDP、TLS 、 DCCP、 SCTP 、 RSVP 、OSPF 等。
5、应用层协议:DHCP 、DNS、 FTP 、Gopher 、 HTTP、 IMAP4 、 IRC、 NNTP 、 XMPP、POP3 、SIP、 SMTP、SNMP 、SSH、TELNET 、 RPC 、RTCP 、RTP 、RTSP、SDP 、 SOAP、GTP、STUN 、NTP、SSDP 、 BGP 等。
5、下列程序段的时间复杂度是:
int fact(int n){
if(n子类的构造方法5、(多选题)以下分别对变量a给出定义,正确的有:
A 一个有10个指针的数组,该指针指向同一个整型数:int *a[10];
B 一个指向10个整型数组的指针:int ( *a)[10];
C 一个指向函数的指针,该函数有一个整型数并返回一个整型数:int *a(int);
D 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数:int ( *a[10])(int);
ABD
C改为:int (*a)(int)
指针数组:首先是一个数组,数组里面的元素都是指针;(存储指针的数组)
数组指针:首先是一个指针,指针指向一个一维数组;(指向数组的指针)
函数指针:一定要理解,回调中经常使用函数指针;
指针函数:就是一个普通函数,只是返回值是指针形式;
6、(多选题)下列叙述正确的是:
A 指针可以为空,引用不能为空。
B 不存在指向空值的引用,但是存在指向空值的指针
C 引用必须被初始化,但是指针不必
D 指针初化后不能被改变,引用可以改变所指对象
ABC
D:引用初始化以后不能被改变,指针可以改变所指的对象
7、下列关于C++容器描述错误的是:
A list类型支持双向顺序访问,在list中任何位置插入删除都很快
B deque类型支持快速顺序访间,在头尾插入/删除速度很快
C C++标准库map的底层实现为红黑树
D vector类型在每次调用 pushback时都在栈上开辟新内存
B
deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。
8、(多选题)C++中,下列数据类型的转换,哪个可能会发生信息丢失?
A int -> double
B int -> long
C long -> float
D int -> char
CD
精度丢失只会发生在从大范围到小范围的转换
32位编译器:
char short int long float double 指针
1 2 4 4 4 8 4
64位编译器:
char short int long float double 指针
1 2 4 8 4 8 8
9、在Java中,要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以:
A 使用 private关键字
B 让该类不使用任何关键字
C 使用public关键字
D 使用protected关键字
B
default和protected的区别是:
前者只要是外部包,就不允许访问。
后者只要是子类就允许访问,即使子类位于外部包。
总结:default拒绝一切包外访问;protected接受包外的子类访问
10、(多选题)list和vector的区别有哪些?
A vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随即存取,而不在乎插入和删除的效率,使用 vector.
B list拥有一段不连续的内存空间,因此支持随机存取,如果需要大量的插入和删除,而不关心随即存取,则应使用list
C 已知需要存储的元素时,使用list较好
D 如果需要任意位置插入元素,使用 vector较好
AB
C:已知需要存储的元素时,vector要好
D:如果需要任意位置插入元素,list要好
编程题1:字符串筛选
给定一个字符串,需要去除所有之前曾经出现过的字符,只保留第一次出现的字符。
样例输入:hello,welcome to xiaomi
样例输出:helo,wcmtxia
思路:
- 首先需要定义两个数组,分别为“输入的字符串数组”old[ ] 以及 “输出的字符串数组” new[ ];
- 取old数组中的第一个字符去和new数组中的每一个字符串相比较是否相同,若出现相同,则取old数组的下一个字符再次与new中每一个字符相比较,若都不相同则存入new的数组中;
- 最后输出数组new;
代码:
#include
void killsame(char *o, char *n)
{
int i=0, j, k=0;
int label;
while(o[i] != '\0')
{
label = 1;
for(j=0; j