前言
👏 Hi! 我是 Yumuing,一个技术的敲钟人
👨💻 每天分享技术文章,永远做技术的朝拜者
📚 欢迎关注我的博客:Yumuing's blog
由于官方答案没有出来,所以,这部分都是根据个人经验和网上收集所得到的第六届青训营结营全解析,如果存在错误,也请在评论区友好讨论,让我们一起把这篇文章变得更加完美。
先罗列一下答案,以 ABCD 作为选择题次序,自行比对,完整解析在后头。
序号 | 答案 |
---|---|
05 | B |
06 | C |
07 | D |
08 | B |
09 | B |
10 | D |
11 | B |
12 | C |
13 | A |
14 | D |
15 | C |
16 | C |
17 | B |
18 | D |
19 | D |
20 | ABC |
21 | ACD |
22 | AD |
23 | ABC |
24 | ABC |
25 | ACD |
26 | ABC |
27 | AD |
详细解析
不保证全部正确,只凭个人经验和网上收集结果所总结出的完整解析答案,如有错误,还希望不吝赐教!感谢。
05 在网络字节序中,所谓"小端”(little endian)说法正确的是
- 高字节数据存放在低地址处,低字节数据存放在高地址处
- 低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处
- 和编译器相关
- 上述答案都不正确
解析:
- 大端字节序(big-endian):按内存的增长方向,低位数据存储于高位内存中,高位数据放低地址,这和我们的阅读习惯一致。
- 小端字节序(little-endian):按内存的增长方向,低位数据存储于低位内存中,高位数据放高地址
网络字节序一般是大端序,主机字节序一般是小端序(比如intel CPU)
故本题选 B
06 机器A的ip地址为202.96.128.130,子网掩码为255.255.255.128,则该ip地址的网络号为
- 202.0.0
- 202.96.0
- 202.96.128.128
- 255.255.255
解析:
ip地址 和 子网掩码 进行 与 运算(与运算:两位同时为“1”,结果才为“1”,否则为0):
由于 255 的二进制 11111111 ,与二进制 A 进行与运算后结果为其本身,即 A,故,ip 段前三段不转换为二进制,其他部分切换成二进制,方便计算,结果如下:
ip地址 202.96.128.130: xxxxxxxx .xxxxxxxx.xxxxxxxx.1000 0010
子网掩码 255.255.255.128 :11111111.11111111.11111111.1000 000 0
与运算之后等于: 202.96.128.128,根据子网掩码我们能知道,ip地址前25位是网络号,剩下的就是主机号
故本题选 C
07 下面的叙述中,()不是设备管理中引入缓冲机制的主要原因
- 缓和CPU和I/O设备间的速度不匹配问题
- 减少对CPU的中断频率和放宽对CPU响应时间的限制
- 提高CPU和I/O设备间的并行性
- 节省系统内存
解析:
缓冲技术是用在外部设备与其他硬件部件之间的一种数据暂存技术,它利用存储器件在外部设备中设置了数据的一个存储区域,称为缓冲区。缓冲技术一般有两种用途,一种是用在外部设备与外部设备之间的通信上的,还有一种是用在外部设备和处理器之间的。
CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。A 正确
在远程通信系统中,如果从远地终端发来的数据仅用一位缓冲来接收,如下图(a)所示,则必须在每收到一位数据时便中断一次 CPU,这样,对于速率为 9.6 Kb/s 的数据通信来说,就意味着其中断 CPU的频率也为 9.6 Kb/s,即每 100 μs 就要中断 CPU 一次,而且 CPU 必须在 100 μs 内予以响应,否则缓冲区内的数据将被冲掉。倘若设置一个具有 8 位的缓冲(移位)寄存器,如下图(b)所示,则可使 CPU 被中断的频率降低为原来的 1/8;若再设置一个 8 位寄存器,如下图(c)所示,则又可把 CPU 对中断的响应时间放宽到 800 μs。故B 正确
缓冲的引入可显著地提高 CPU 和 I/O 设备间的并行操作程度,提高系统的吞吐量和设备的利用率。例如,在 CPU 和打印机之间设置了缓冲区后,便可使 CPU 与打印机并行工作。故 C 正确
缓冲机制,简单讲就是通过空间换时间,故不可能节省系统内存。
故本题选 D
08 避免死锁的一个著名的算法是
- 先入先出法
- 银行家算法
- 优秀级算法
- 资源按序分配法
解析:
这个就毋庸置疑了。银行家算法:
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。这种情况必须避免死锁的出现。
故本题选 B
09 原语的执行是屏蔽中断的
- 错
- 对
解析:
原语就是一种原子操作,故屏蔽中断操作
故本题选 B
10 关于无缓冲和有缓冲的channel,下面说法正确的是
- 无缓冲的channel是默认的缓冲为1的channel
- 无缓冲的channel和有缓冲的channel都是同步的
- 无缓冲的channel和有缓冲的channel都是非同步的
- 无缓冲的channel是同步的,而有缓冲的channel是非同步的
解析:
- 无缓冲通道默认缓冲为 0
- 无缓冲通道在没有接收方的时候,发送方会阻塞,故无缓冲的channel是同步的
- 有缓冲通道在没有接收方的时候,如果缓冲区未满,则发送方并不会阻塞,故有缓冲的channel是非同步的
故本题选 D
11 小袁今天刚学会了defer延迟调用,他在草稿纸上编写了下面一段代码。请问下列代码的输出是
- 123
- 132
- 312
- 321
解析:
很简单的逻辑,自行理解吧,原题可运行代码如下:
package main
import (
"fmt"
)
type S struct{
}
func (s S) p(n int) S {
fmt.Print(n)
return s
}
func main() {
var s S
defer s.p(1).p(2)
fmt.Print(3)
}
可自行测试,答案为 132,故本题选 B
12 关于函数声明,下面语法错误的是
- func f(a, b int) (value int, err error)
- func f(a int, b int) (value int, err error)
- func f(a, b int) (value int, error)
- func f(a int, b int) (int, int, error)
解析:
函数返回参数要么都有变量名,要么都用类型表示,选项C中返回参数一个有变量名,一个没变量名,不统一。故本题选 C。
13 Go语言中,以下选项正确的是
- int 和 uint 的取值范围与体系架构有关
- int 的取值范围是 [0, 4294967296)
- uint 的取值范围是 [0, 4294967296)
- int 的取值范围是 [-9223372036854775808, 9223372036854775807]
解析:
int 和 uint 的取值范围与体系架构有关,在 32 位机中等价于 int32 和 uint32,在 64 位机中等价于 int64 和 uint64。
故本题选 A
14 SQL语言允许使用通配符进行字符串匹配的操作,其中“%'可以表示
- 零个字符
- 一个字符
- 多个字符
- 其他三项都可以
解析:
% 可以表示任意个字符,可以是零个、一个、多个字符。
故本题选 D
15 关系型数据库创建表都有主键,以下对主键描述正确的是
- 主键足唯一素引,唯一索引也是主键
- 主键是一种特殊的唯一性索引,只可以是聚集索引
- 主键是唯一、不为空值的列
- 对于聚集索引来说,创律主键时,不会自动创建主键的聚集索引
解析:
- 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
- 唯一性索引列允许空值,而主键列不允许为空值。
- 主键列在创建时,已经默认为空值 + 唯一索引,默认主键有聚集索引
故本题选 C
16 以下可以获取历史消息的是
- topic 交换器
- fanout 交换器
- direct 交换器
- 以上都不是
解析:
以上三个选项均为 RabbitMQ 交换器类型,fanout 和 topic 都是广播形式的,是没有历史数据的,也就是说对于中途创建的队列,获取不到之前的消息,而 direct 可以。
故本题选 C
17 某线性表中有100000个元素,其中前99990个元素递增有序,则采用()方法进行递增排序时关键字比较次数最少
- 简单选择排序
- 直接插入排序
- 二路归并排序
- 快速排序
解析:
根据题目中的“前99990个元素递增有序”,得出关键字比较次数最少的原理就是这99990个元素不参与比较或者移动等耗时操作。
根据以下对各种排序的思想分析,二路归并和快速排序没有利用大部分为递增序列而不参与比较或者移动的操作,简单排序的时间复杂度大于直接插入排序。
- 简单选择排序思想为在当前待排序数列中选出最小值添加到有序序列中,其移动次数正序为0次,比较次数复杂度O(n****2)。
- 直接插入排序思想为整个排序过程为n-1趟,先将序列中的第一个当成有序子序列,然后从第二个开始逐个进行插入,直至整个序列有序,最好的情况下正序移动次数为0,比较次数为n-1,时间复杂度为O(n)。
- 二路归并排序初始序列含有n个记录则可以看成n个有序的子序列,每个子序列长度为1;两两合并,得到n/2个长度为2或1的有序子序列,再两两合并,……如此重复,直到得到一个长度为n的有序序列为止。归并时间复杂度O(nlog**2**n)
- 快速排序选定一个基准值,通过一趟排序将待排分割成独立的两部分,前一部分均小于或等于基准值,后一部分大于基准值,然后对每个部分继续进行上述的重复操作,直到整个序列有序。最好的情况是基准值能够均衡分为两部分,最坏的就是只得到一个比上一次划分少一个记录的子序列O(n2)
故本题选 B
18 某个大型的网络游戏网站,现有几亿用户,为了实时获取前十名游戏分数最高的玩家,使用以下哪个排序算法比较合理?
- 基数排序
- 快速排序
- 二叉排序
- 堆排序
解析:
本题需要考虑两个方面的内容:
- 两亿用户:空间
- 实时获取:时间
快速排序只有在对整个空间排序完成后才能找出前10名,因而时间复杂度是 O(logN) ,不够快
时间上,基数排序会比堆排要快。但是基数排序需要更多的额外空间
堆排序,每次排序的结果就是找到当前堆中的最大/最小值。因此完成需求的时间复杂度为O(logN)。当我们需要找到常数级的最大/最小值时,往往堆排序是我们应该最先考虑的。
故本题选 D
19 题目描述中给出了四个排序相关的说法,让我们选择错误的是哪个,下面是每个说法的具体内容
- 快速排序算法平均速度比插入排序快
- 堆排序在每一趟排序过程中,都会有一个元素放置在最终位置上
- 在 10000 个无序的元素中查找最大的 10 个元素,使用快速排序最快
- 插入排序是一种稳定的排序算法
解析:
参考下图即可排除 A,可选 D
堆排序是依照二叉树的性质构成大顶堆或者小顶堆。arr[i]>=arr[2i+1]&\&arr[i]>=arr[2i+2] 或者改成<=。例如大顶堆,整个序列的最大值就是堆顶根节点,将其与末尾元素交换,末尾就是最大值(确定了最终位置),然后剩余的元素继续建堆逐渐确定剩余元素的最终位置,排除 B
故本题选 D
20 下列有关进程的说法中,错误的是
- 进程与程序是一一对应的
- 进程与作业是一一对应的
- 进程是静态的
- 进程是动态的过程
解析:
进程和程序之间可以形成一对一,一对多,多对一,多对多的关系。 A错误,可选
执行一条命令或运行一个应用程序时 | 一对一 |
---|---|
进程在执行过程中可以加在执行不同的程序 | 一对多 |
以不同的参数或数据多次执行同一个程序 | 多对一 |
并发地执行不同的应用程序 | 多对多 |
进程是具有一定独立功能的程序关于某个数据集合上的一次运行运动,进程和程序的区别在于程序是静态的,而进程是动态的。 C 错误,可选
故本题选 ABC
21 以下有关Http协议的描述中,正确的有
- post请求一般用于修改服务器上的资源,对发送的消息数据量没有限制,通过表单方式提交
- HTTP返回码302表示永久重定向,需要重新URI
- 可以通过206返回码实现断点续传
- HTTP1.1实现了持久连接和管线化操作以及主动通知功能,相比http1.0有大福性能提升
解析:
301永久重定向 302 临时重定向,排除 B
故本题选 ACD
22 关于协程,下面说法正确是
- 协程和线程都可以实现程序的并发执行
- 线程比协程更轻量级
- 协程不存在死锁问题
- 通过channel来进行协程间的通信
解析:
协程(Coroutine,又称微线程)是一种比线程更加轻量级的存在,排除 B
协程间任务分配是分发式而非抢占式,所以不存在线程安全方面的问题,但没有死锁方面的特殊保护机制,还是存在死锁问题。排除 C
故本题选 AD
23 关于接口,下面说法正确的有
- 只要两个接口则有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以相互赋值
- 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A
- 接口查询是否成功,要在运行期才能够确定
- 接口赋值是否可行,要在运行期才能够确定
解析:
只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以相互赋值。
go里面没有引用传递,只有值传递,故可以直接接口赋值
Go语言接口是否可以赋值,是在编译期就确定的。接口的查询是在运行期确定。如:
在接口类型进行赋值操作时,若类型不匹配,则编辑器就会提示错误,因此接口赋值操作是在编译期确定的
故本题选 ABC
24 关于数据库索引,以下说法错误的是
针对某些字段建立索引,能够有效的减少相关数据库表的磁盘空间占用;
针对某些字段建立索引,能够有效的提升相关字段的读与写的效率;
常见数据库管理系统,通常使用hash表来存储索引;
数据库索引的存在,可能导致相关字段删除的效率降低;
解析:
索引需要额外的磁盘空间,为一索引页,包含着索引记录,每条索引记录包含键值和逻辑指针。A 可选
针对某些字段建立索引,如果读写性能都能提高,那每个字段都建立索引,岂不是万事大吉,当然,不可能啦。B 可选
常见数据库管理系统,通常使用 B 树相关(B+、B*)来存储索引
数据库索引的存在,可能导致相关字段删除的效率降低;其增加了动态维护的成本,效率降低。D 排除
故本题选 ABC
25 请描述http请求get和post的区别,下面描述正确的有
GET用于信息获取,而且应该是安全的和幂等的,POST表示可能修改变服务器上的资源的请求
POST比GET安全,因为采用了SSL加密
GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据
POST提交,把提交的数据放置在是HTTP包的包体中,GET提交的数据会在地址栏中显示出来
解析:
- 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说, GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。
- http没有采用加密技术,https采用了SSL加密
- GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
- 使用 Get 的时候,参数会显示在地址栏上,而 Post 不会,提交的数据放置在是HTTP包的包体中
故本题选 ACD
26 互联网接入系统内的负载均衡系统可以解决什么问题
- 服务容灾
- 健康检查
- 横向扩容
- 域名解析
解析:
本题答案较为不确定,自行判断。
- 使用负载均衡时,您可以将负载均衡实例部署在支持多可用区的地域以实现同城容灾。通过该特性可实现当可用区机房发生故障时,负载均衡能在较短时间内,将前端访问流量切换到同一地域下的其它可用区,恢复服务能力。即服务容灾能力
- 负载均衡器会定期向后端服务器发送请求以测试其运行状态,这些测试称为健康检查
- 负载均衡系统可以根据业务发展需要,通过随时添加和移除ECS实例来扩展应用系统的服务能力,适用于各种Web服务器和应用服务器。即横向扩容能力。
域名解析是 DNS 服务器可以解决的问题。
故本题选 ABC
27 现有一数列(3,2.5.7.6.8),要求按升序排序,下面说法正确的是
插入排序(从后向前)需要做6次比较
快速排序,每次选择最后一个元素作为支点,需要比较5次
快速排序,每次选择最后一个元素作为支点,需要比较9次
快速排序,每次选择最后一个元素作为支点,需要比较12次
解析:
直接插入排序,每次需要遍历一次数组,需要5+4+3+2+1=15次比较
快速排序,选择最后一个元素为基,第一遍需要5次比较,第二趟对8的左侧进行快速排序,需要4次比较,结果使6,7交换,第三次在6的左侧快速排序,需要2次比较,第四次在5的左侧快排,需要1次比较,加起来5+4+2+1=12次
故本题选择 AD
总结
说实话,此次的结营测试并没有想象的那么困难,更像是大学里面的期中考内容,与实际的开发内容并没有相关,甚至内容都是基础,并非特别深入,需要久久思考的题目。
本次全解析内容就是这样了,有什么问题,都可以指出了,欢迎大家友好讨论!