成都美团测试开发一面面经

1、自我介绍

面试官下午好,我是某某,来自某地,目前就读于某某学校。

2、学过的课程

计算机网络,数据结构,操作系统,计算机组成原理。

3、说出五个linux指令

ip addr

service network restart

start nginx

nginx -s stop

docker images

4、数据库索引

数据库索引其实就是为了使查询数据效率变快。
优点:
1.通过创建索引,可以在查询的过程中,提高系统的性能;
2. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
3. 在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间;
缺点:
4. 创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大;
5. 索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大;
6. 在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地维护;

5、B+树是怎么实现的

首先B+树拥有B树的全部优点,每个节点增加了多个子节点,每个叶子可以容纳更多的节点,导致减少I/O次数,增加了性能。不同的是B+树的数据只在叶子节点存储,这样每个节点相比于B树更小,从而使树更浅。其次扫库扫表的能力更强,因为叶子节点是双向指针,我们可以从叶子节点开始查询,无需回到根节点重新查询。在排序与范围查找能力更强,因为其可以直接在叶子节点进行查询。 二叉树算法时间复杂度是lg(N)。

6、http和https的区别

1.https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

7、SSL协议

Secure Socket Layer, SSL是一个不依赖于平台和运用程序的协议。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
SSL协议提供的安全通道有以下三个特性:
机密性:SSL协议使用密钥加密通信数据;
完整性:SSL协议会对传送的数据进行完整性检查;
可靠性:客户和服务器都会被认证,客户的认证是可选的;

8、https加密方式

Http直接通过明文在浏览器和服务器之间传递消息,容易被监听抓取到通信内容。
Https采用对称加密和非对称加密结合的方式来进行通信。
Https不是应用层的新协议,而是Http通信接口用SSL和TLS来加强加密和认证机制。
对称加密:加密和解密都是同一个密匙。
非对称加密:密钥成对出现,分为公钥和私钥,公钥加密需要私钥解密,私钥加密需要公钥解密。
对称加密和非对称加密结合方式:
浏览器使用Https的URL访问服务器,建立SSL链接。
服务器收到SSL链接,发送非对称加密的公钥A返回给浏览器
浏览器生成随机数,作为对称加密的密钥B
浏览器使用公钥A,对自己生成的密钥B进行加密,得到密钥C
浏览器将密钥C,发送给服务器。
服务器用私钥D对接受的密钥C进行解密,得到对称加密钥B。
浏览器和服务器之间可以用密钥B作为对称加密密钥进行通信。

9、https网址请求过程

客户端发起HTTPS请求,服务端配置,传送证书,客户端解析证书,传送加密信息,服务端解密信息,传输加密后的信息,客户端解密信息

10、DNS怎么找的ip地址

解析域名的过程如下:
首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
若没有命中,则继续搜索操作系统的 DNS 缓存
若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器采用递归查询自己的 DNS 缓存,查找成功则返回结果
若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询
(1) 首先本地域名服务器向根域名服务器发起请求,根域名服务器返回*域名服务器的地址给本地服务器
(2) 本地域名服务器拿到这个*域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
(3) 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起
至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起

11、服务器返回2XX,3XX,4XX,5XX代表什么

1xx(临时响应)
2xx (成功)
3xx (重定向)
4xx(请求错误)
5xx(服务器错误)
常用的一些状态码:
200:请求成功;
400:请求语法有错误,不能被服务器所理解;
404:请求资源不存在;
500:服务器发生不可预期的错误;
503:服务器不能处理客户请求;

12、Tcp三次握手,四次挥手,过程及原因

TCP三次握手过程:
a、起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;
b、Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态
c、Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。
三次握手的原因:
 a、第三次握手是为了防止:如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是:服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。
 b、第三次握手是为了防止已经失效的连接请求报文段突然又传到服务端,譬如发起请求遇到类似这样的情况:客户端发出去的第一个连接请求由于某些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才到达服务端,这是一个早已失效的报文,但是此时服务端仍然认为这是客户端的建立连接请求第一次握手,于是服务端回应了客户端,第二次握手。如果只有两次握手,那么到这里,连接就建立了,但是此时客户端并没有任何数据要发送,而服务端还在傻傻的等候佳音,造成很大的资源浪费。所以需要第三次握手,只有客户端再次回应一下,就可以避免这种情况。
四次挥手过程:四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

13、逻辑思维题目:

(1)一根不均匀的绳子,从头烧到尾要一个小时,怎么用这个绳子计算半个小时呢?
头和尾同时点燃,等待绳子烧完时即为半小时。
(2)若干条这样的绳子,怎么用他们计算一个小时15分钟?
同时点燃A绳子的两端 和B绳子的一端 ,当A绳子熄灭时,B绳子少了半个小时还剩半个小时,再次点燃剩余的B绳子的两端,此时开始计时,当B绳子熄灭时过了15分钟,立即点燃C绳子,全部熄灭就是1小时15分钟了

14、SQL编程:给了三个表班级表,学生表,班级学生表,查询某个班级学生成绩大于80的学生

select student from class where score > 80

15、算法编程:给定一个数组,找出里面和等于target的下标对。(两数之和)

public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if(map.containsKey(complement)) {
                return new int[]{map.get(complement), i};
            } else {
                map.put(nums[i],i);
            }
        }
        return null;
    }
上一篇:常用的10种算法(8~10)


下一篇:SpringCloud设置随机端口后的问题