小米软件开发笔试题

第一卷

1.下列关于设计模式说法错误的是( )
正确答案: B

A。装饰器模式在实现过程中一般不会更改被封装对象的接口定义
B。适配器模式以不改变被适配对象的接口定义为目的对其进行改造(错误)
C。用饿汉方式实现的单列模式是不能够被继承的
D。简单工厂模式可以实现按客户端条件动态创建对象的效果

解析:
1.装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能(ps:是对象,可以通过构造器注入),同时又不改变其结构.
例子: java中的I/O流
2.适配器模式(Adapter Pattern) 是两个不兼容接口之间的桥梁.
这种模式涉及一个单一的类(被适配对象),该类负责加入独立的或不兼容的接口.
3.饿汉模式是类加载会触发初始化创造示例,创建的是父类对象,若继承的话,创建的依旧是父类对象.
4.简单工厂模式可以实现按照客户端动态条件创造对象.

2.从尚未排序的N名学生的考试分数中挑出排名第K的分数,平均时间复杂度最优可以达到多少?( )
答案:C

A  O(N*K)
B  O(N*logN)
C  O(N)
D  O(N^2)

解析:考试成绩说明是有限范围内的数,就可以用堆排序或者计数排序,复杂度都是O(n+k), 约等于0(n)

3.在下列序列中,若以最后一个数字为基准进行快速排序(升序),第一趟数字被移动次数最多的是()
正确答案: B

A 102, 106, 98, 52, 40, 45, 120, 110
B 102, 106, 110, 120, 52, 45, 40, 98
C 110, 106, 102, 45, 40, 120, 98, 52
D 52, 40, 45, 102, 110, 106, 98, 120

B项 小数都集中在后面。

4.1,2,3,4,5 五个数字,能组成多少种不同的二叉搜索树的结构?

42种,

5.下面关于有向无环图说法错误的是?( )
正确答案: D

A 有向无环图至少有一个顶点入度为0
B 有向无环图至少有一个顶点出度为0
C 有向无环图至少有一个拓扑排序
D 有向无环图可以转换成树(错误)

解析:树的节点的父节点只能是一个,而无环图的节点可以有多个入度(父节点)

6.以下说法正确的有( )
正确答案: A B D

A 1个堆栈可以通过1个数组或者1个单向链表来实现,出栈和入栈的均摊复杂度均为O(1)
B 1个先进先出队列可以通过1个数组或者1个单向链表来实现,出队和入队的均摊复杂度均为O(1)
C 1个堆栈可以通过2个先进先出队列来实现, 出栈和入栈的均摊复杂度均为O(1)
D 1个先进先出队列可以通过2个堆栈来实现,出队和入队的均摊复杂度均为O(1)

7.UNIQUE惟一索引的作用是( )
正确答案: C

A 保证惟一索引不能被删除
B 保证各行在该索引上的值不得为NULL
C 保证各行在该索引上的值都不得重复
D 保证参加惟一索引的各列,不得再参加其他的索引

8.数据库表a主键为id,共10行,表b存在关联列aid,共5行,以下查询

select count(1) from a left join b on a.id = b.aid

可能的结果为( )
正确答案: B

A  5
B  10
C  15
D  50

9.在一个真实的计算机系统中,资源会损坏或被替换,新的进程会进入和离开系统,新的资源会被购买和添加到系统中。如果用银行家算法控制死锁,下面哪些变化是安全的(不会导致可能的死锁)?( )
正确答案: B C

A 增加可用资源(新的资源被添加到系统)
B 减少可用资源(资源被从系统中永久性地移出)
C 增加一个进程的Max(进程需要更多的资源,超过所允许给予的资源)
D 减少一个进程的Max(进程不再需要那么多资源)

10.在一个真实的计算机系统中,可用的资源和进程命令对资源的要求都不会持续很久是一致的长期(几个月)。资源会损坏或被替换,新的进程会进入和离开系统,新的资源会被购买和添加到系统中。如果用银行家算法控制死锁,下面哪 些变化是安全的(不会导致可能的死锁)?( )
正确答案: B C

A 增加可用资源(新的资源被添加到系统)
B 减少可用资源(资源被从系统中永久性地移出)
C 增加一个进程的Max(进程需要更多的资源,超过所允许给予的资源)
D 减少一个进程的Max(进程不再需要那么多资源)

11.在C++中,声明 int const** const * const x 表示x是什么类型?
正确答案: C

A 一个const数组,每个成员都是一个const二维int类型const数组
B 一个const指针,指向一个const双层指针,指向一个int
C 一个const指针,指向一个const指针,指向一个普通指针,指向一个const int
D 一个const指针,指向一个const指针,指向一个const int,它存着一个指针

解析:
从最里层往外看,它是一个const指针
往外走一层,上层指针指向的是一个const的指针
再往外走一层,挖掉里面两层的剩下int const * x,这是一个指针,它指向的一个不可更改的int数据
所以结合起来,应该是是一个const指针,指向一个const指针,指向一个普通指针,指向一个const int。

12.以下问题错误的是( )
正确答案: B

A 类不是在类定义里定义数据成员时初始化数据成员,而是通过构造函数控制初始化。
B extern double pi=3.14 此声明没有分配及初始化存储空间(错误)
C 变量或函数的定义尽量不要放在头文件中。因为头文件包含在多个源文件中,所以不应该含有变量或函数的  定义
D const对象可以定义在头文件中

13.下面关于虚函数的描述中,正确的是( )
正确答案: A B C

A 虚函数必须是非静态成员函数。
B 对于虚函数,virtual关键字只能出现在类定义中的函数原型声明中,不能出现在类体外的函数定义中.
C 根据类型兼容规则,基类指针(或引用)可以指向其派生类的实例,但在非虚函数的情况下,通过基类指针(或引用)却只能调用基类的函       数成员,无法调用其所指实例(派生类)的函数成员。
D 对于多态类,应该将构造函数和析构函数都声明为虚函数。//析构应该声明为虚构,构造不需要

14 下面STL容器中,哪些是有序的( )
正确答案: B D

A vector
B map
C stack
D set.

16 Java虚拟机里提供了哪些调用字节指令()
正确答案: A B C

A invokestatic
B invokespecial
C invokevirtual
D invokemethod

解析:
invokestatic 静态方法

invokespecial 构造方法,private方法,父类方法.

invokevirtual,invokeinterface 调用重写的方法(动态单分派).

invokedynamic 动态类型语言,动态方法调用(lambda表达式)

17.在Python 3中,对于字符编码叙述正确的是()
正确答案: B

str为unicode字符(内部编码utf-16),byte编码为utf-8
B str为unicode字符(内部编码utf-16),byte无编码
str编码为utf-16,byte为utf-8
str编码为utf-8,byte无编码

18.编译程序目标代码生成阶段主要任务是()
正确答案: D 你的答案: B (错误)

A 把高级语言翻译成汇编语言
B 把高级语言翻译成机器语言
C 把汇编语言翻译成机器语言
D 把中间代码变换成依赖具体机器的目标代码

19.在X86平台上,C语言函数调用时,通过以下哪种方式传递参数?
正确答案: C

A 寄存器
B 内存
C 堆栈
D 变量地址

20.编译程序不仅包含词法分析、语法分析、中间代码生成、目标代码生成,还包括()
正确答案: A B D

A 代码优化
B 表格管理
C 源代码优化
D 出错处理

第二卷

1.计算大于n(n>1)的最小的斐波那契数,以下划线出应填入

function f(n:int){
    int[] a = new int[2];
    a[0] = a[1] = 1;
    int i =1 ;
    while(true){
       i = (i + 1)%2
       a[i] = ______
       If(a[i] > n){
         return a[i]
       }
    }
}

正确答案: B

A  a[i] + a[i + 1]
B  a[i % 2] + a[(i+1)%2]
C  a[i] + a[i -1]
D  a[i%2] + a[(i-1)%2]

解析:
a[]的大小是2,所以只有a[0],a[1],当i = 0时(i为奇数),a[i - 1]越界,i = 1时,a[i + 1]越界,因此排除ACD

void fun(int n) {
      int i=2;
      while(i<=n)
      i=i*i;
}

复杂度()
正确答案: D

A O(n)
B O(n2)
C O(√n)
D O(log2n)

3.下面关于树的遍历算法说法错误的是?()
正确答案: A B

A 先序遍历属于广度优先遍历算法
B 中序遍历属于广度优先遍历算法
C 中序遍历属于深度优先遍历算法
D 后序遍历属于深度优先遍历算法

解析:
先序,中序,后序三种应该都归为深度优先遍历算法,只有层次遍历才算广度优先遍历算法
说简单一些,DFS的实现原理是递归栈,表现为递归,用栈实现;二叉树的三种遍历方式也是同理,表现为递归,用栈实现。所以,二叉树的三种序列遍历都属于DFS。

4.关于排序算法,以下的哪些叙述是正确的?( )
正确答案: C D

A 快速排序的最坏时间复杂度为O(nlog(n)),它是一个不稳定排序
B 冒泡排序的时间复杂度为O(n^2),它是一个不稳定排序
C 归并排序的时间复杂度为O(nlog(n)),它需要O(n)的额外存储空间来完成排序
D 堆排序的最坏时间复杂度为O(nlog(n)),它不需要额外存储空间来完成排序

参考《程序员面试宝典》 245页

5.初始化序列为9,1,10,7,6,5,2,8的一组数采用堆排序,当建大根堆完毕时,堆所对应的二叉树中序遍历序列为:()
正确答案: D

A 1 8 7 6 10 9 2 5
B 7 1 8 6 10 5 9 2
C 7 8 1 6 10 2 5 9
D 1 7 8 6 10 5 9 2

6.高度为7的完全二叉树的节点总数不可能是:()
正确答案: D

A  128
B  192
C  255
D  256

解析:
当为6层的话,最多2^7-1=127个。
当为7层的话,最多2^8-1=255个。
合法的应该是[128,255]之间。
D项不满足。

7.关系数据库的事务具有下列哪些特点()

- 原子性(Atomicity):事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。
- 一致性(consistency):这表示数据库的引用完整性的一致性,表中唯一的主键等。
- 隔离性(Isolation):可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
- 持久性(Durability):一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。

8.下面笛卡尔积的基数计算正确的选项有哪些?()
正确答案: A D

A D1={
    
    张三,李四,王五}, D2={
    
    男,女}, D3={
    
    北京,西安}, D1xD2xD3的基数是12    3 * 2 *2
B D1={
    
    月亮,地球}, D2={
    
    行星,卫星}, D3={
    
    宜居,非宜居}, D1xD2xD3的基数是6
C D1={
    
    张三,李四,王五}, D2={
    
    男,女}, D3={
    
    北京,西安}, D1xD2xD3的基数是7
D D1={
    
    张三,李四,王五}, D2={
    
    男,女}, D3={
    
    北京,西安,海南}, D1xD2xD3的基数是18   3 * 2 * 3

基数直接乘起来,如果是问元素就加起来

9.Linux父进程在fork一个子进程时如下哪些行为在系统层不会发生:()
正确答案: D

A 生成一个新的PID
B 复制父进程的数据
C 执行子进程函数
D 父进程等待子进程终止后退出

10下列描述中错误的是______.
正确答案: A B D

A 相比交换机,路由器可以提供更大的带宽和数据转发功能
B 在IP分类地址方案中,159.226.181.1是一个C类地址。
C IP协议利用TTL控制数据传输的时延。
D HTTP的长连接可以永久保持。

解析:
A. 交换机可以提供更大的带宽和数据转发功能。
B. C类IP地址范围从192.0.0.1-223.255.255.254,所以应该是B类地址。
D. Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

11已知:print()是一个类的常成员函数,无返回值,下列表示中正确的是()
正确答案: A

A void print () const;
B const void print ();
C void const print ();
D void print (const);

12下面关于C++异常处理描述中,错误的是()
正确答案: A

A 当异常处理语句找到一个匹配的catch异常处理后,将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有栈对象和堆对象进行析构,这一过程称为解旋。
B 一个异常安全的函数,在有异常抛出时不应泄露任何资源,且不能使任何对象进入非法状态。
C 为实现异常安全的编程,应尽量确保析构函数不抛掷异常。
D 函数声明“void fun() throw();”表示该函数不抛掷任何类型异常;若无异常接口声明,则此函数可以抛掷任何类型的异常。

解析:
栈解旋:当发生异常时,从进入try块后,到异常被抛掷前,这期间在栈上的构造的所有对象都会被自动析构。析构的顺序与构造的顺序相反,这一过程被称为栈的解旋。
A项多了堆对象。

13.下面代码段存在致命问题的是单选()
正确答案: A

A
	#include <stdio.h>
	
	register int i = 0;
	printf("i = %d, &i = %p\n", i, &i);
B 
	#include <stdio.h>
	
	int * restrict p = 0;
	printf("p = %p\n", p);
c
	#include <stdio.h>
	
	volatile int j = 0;
	printf("j = %d, &j = %p\n", j, &j)
D 
	#include <stdio.h>
	
	int main(void) {
    
    
	int * k = malloc(8)
	printf("k = %d, &k = %p\n", *k, k);
	return 0;
    }

解析:
“寄存器变量通常储存在计算机内存中。如果幸运的话,寄存器变量储存在 CPU 的寄存器中,或者概括地说,储存在最快的可用内存中。与普通变量相比,访问和处理这些变量的速度更快。由于寄存器变量储存在寄存器而非内存中,所以无法获取寄存器变量的地址。”
摘录来自: [美]史蒂芬·普拉达(Stephen Prata). “CPrimer Plus(第6版)中文版。” Apple Books.

14.关于析构函数和构造函数,下列说法正确的是()
正确答案: A B D

A 若类中没有定义构造函数和析构函数,则系统会给出隐含的默认构造函数和析构函数
B 析构函数不能被继承
C 构造函数允许重载,且可以通过参数个数、参数类型或返回值来区分类的构造函数可以为内联函数、重载函数或带默认形参值的函数
D 类的构造函数可以为内联函数、重载函数或带默认形参值的函数

解析:
C项,返回值不能用来区分重载。

15.关于Java下列说法正确的是有几个()

1. getDeclaredMethod方法能获取一个类的父类方法
2. 在finally语句块中的return语句不一定可以被执行到
3. final关键字修饰的方法内局部变量可以被多个线程共享
4. Java 8中的interface的抽象方法可以用static修饰

解析:
1错,getdeclaremethod只能拿本类声明的方法
2对,即使执行了try,也不一定执行finally,比如:System.exit(0);它表示退出当前Java虚拟机,一旦退出Java虚拟机,任何代码都不会再执行。
3错,final修饰的内部类的局部变量才可以被共享
4错,abstract是抽象类的标识,抽象类是为了方便继承,实现多态,所以从感性的角度来讲,那是绝对不能与static、final以及private共存的,因为抽象类本来就是为了方便继承实现子类研发的,我们使用了private、final以及static就没有任何意义了

16.以下哪些操作可能会导致JDK8方法区(Metaspace)溢出?
正确答案: C D

A 短时间内创建大量对象
B 调用一个没有退出条件的递归方法
C 创建大量动态代理(生成大量Class并加载)
D 加载一个包含大量class文件的Jar包

17.给定nums=[1,2,3,4,5],以下表达式的结果为[3,4]的是哪个?()
正确答案: B

A nums[2:-3]
B nums[2:-2]
C nums[3:-3]
D nums[3:-2]

18.以下说法正确的是?()
正确答案: C

A Java代码在执行时,JVM会先将Java代码编译为字节码,再讲字节码编译为所在平台的C语言代码
B C++代码在编译后会变成所在平台的C语言代码
C 某些情况下,编译器会调整特定代码的执行顺序来提高代码的执行效率
D 说法都不正确

19.以下哪些是最简DFA的特点()
正确答案: A B

A 没有两个状态是互相等价
B 没有多余状态
C 只有一个中间态
D 终态个数和初态个数相同

20.关于溢出说法错误的是()
正确答案: D

A 缓冲区溢出指的是写入超过缓冲区能保存的最大数据量的数据
B 忘记递归的结束条件会造成堆栈溢出
C 防止缓冲区溢出的工作通常需要编译器完成
D 内存溢出指的是因未及时释放导致系统可用内存越来越少

解析:
内存溢出指申请的内存空间不足
内存泄漏指申请内存空间后无法释放造成内存堆积

来源:
卷一
卷二

欢迎关注公众号,干货满满。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43499780/article/details/108998456