小米2020校招软件开发工程师笔试题二

1. 计算大于n(n>1)的最小的斐波那契数,以下划线出应填入(B
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]
		}
	}
}

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]

解析:
由于创建的数组只有2的容量,因此每一次while循环中都要进行模2操作,来确定当前值所在数组中的位置,排除A、C。第一次while循环,int i =1 ; i = (i + 1)%2 = 0,此时的 i - 1 出现数组越界,因此排除D

2.复杂度(D
void fun(int n) {
	int i=2;
	while(i<=n)
		i=i*i;
}

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

解析:
时间复杂度,就是执行次数最多的那个语句次数。
这段程序中,执行次数最多的就是 i = i * i;
其执行的次数为:
i * i * i * i *…* i<=n
假设为x次,
则 i x <= n
i x = n 可以推出 x = log ⁡ i n \log_i{n} login
i = 2
所以,时间复杂度为 O( log ⁡ 2 n \log_2{n} log2n)

3. 下面关于树的遍历算法说法错误的是?(A B

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

解析:
层序遍历属于广度优先遍历算法

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

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

解析:
快排最坏时间复杂度为O(N2)
冒泡排序是稳定排序

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

解析:
深度是从根节点数到它的叶节点,高度是从叶节点数到它的根节点。

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

A. 原子性
B. 并发性
C. 隔离性
D. 持久性

解析:
数据库事务的特点:原子性、一致性、分离性、持久性

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

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

解析:
基数 = 数据集的元素个数乘积

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

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

解析:
https://blog.csdn.net/nan_lei/article/details/81636473

10. 下列描述中错误的是(A B D

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

解析:
A. 交换机可以提供更大的带宽和数据转发功能
B.在这里插入图片描述
D. 长连接具有过期时间,防止资源浪费

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

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

解析:
类的常成员函数声明格式为:类型说明符 函数名(参数表) const

12. 下面关于C++异常处理描述中,错误的是(A

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

解析:
https://blog.csdn.net/weixin_42380877/article/details/81272629
https://blog.csdn.net/misayaaaaa/article/details/89928087
栈解旋:当发生异常时,从进入try块后,到异常被抛掷前,这期间在栈上的构造的所有对象都会被自动析构。析构的顺序与构造的顺序相反,这一过程被称为栈的解旋(unwinding)

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;
}

解析:
无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。

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

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

解析:
https://www.cnblogs.com/chenwx-jay/p/inline_cpp.html
https://www.cnblogs.com/Kiven5197/p/8862382.html
函数名必须相同,返回值可以相同,也可以不同。参数个数不同;个数相同时类型不同;参数个数类型都相同时参数顺序不同。这三种情况都满足重载要求。也就是说重载函数区分的方法只能从函数的形参里看。

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

A. 1
B. 2
C. 3
D. 4

解析:
A. Method[] getDeclaredMethods() 不止获取一个, 所以A错误
B. 当try语句里面包含System.exit(0)时, finally语句不会执行, 所以B正确
C. fianl 可以保证正在创建中的对象不能被其他线程访问到, 所以C错误
D. java中抽象类的方法可以不能用static来修饰,自由抽象类的属性可以。接口中的方法也不行,接口只是抽象类的一个特殊的。所以D错误
https://blog.csdn.net/xiaoxiaoxuanao/article/details/52573859

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

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

解析:
方法区存放的是Class类型信息,类名,常量池,修饰符,方法描述等信息。使用了过多的静态变量。常量池也被大量的占用。jvm在“运行期间” 产生了大量的类。导致填满了方法区。比如使用反射,动态代理,字节码生成技术会在运行期间产生大量的类和类型信息。如hibernate,spring第三方框架大量使用了cglib技术产生大量的动态类。大量的jsp在编译生成java类时也有可能产生方法区溢出,GC对方法区的回收非常苛刻的,因为对于一个类的回收条件就很严格。

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. 说法都不正确

解析
通过volidate可以防止指令重排

19. 以下哪些是最简DFA的特点(A B

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

20. 关于溢出说法错误的是(D

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

解析:
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免。通常不会导致系统崩溃。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值