1.单链表反转写
单链表是一种线性结构,它是由一个个节点(Node)组成的。并且每个节点(Node)是由一块数据域(data)和一块指针域(next)组成。
节点的数据域:data数据域一般就是用来存放数据的 。
节点的指针域:next指针域一般就是存放的指向下一个节点的指针,即:指针域中存放的是下一个节点对象的引用变量。
我们要解决这道题,需要明确两件事:
- 单链表的数据结构表示
- 单链表的逆序方法
单链表的数据结构表示(两个属性:data存放数据,next存放下一个节点对象的引用变量)
public class Node<T> {
// 节点的数据域
public T data;
// 节点的指针域
public Node next;
/**
* 构造方法
* @param data 数据域值
*/
public Node(T data) {
this.data = data;
}
单链表逆序:一般可以采用三种方式:递归、双指针和循环遍历。
以下采用双指针法作为演示:
/**
* @PACKAGE_NAME: com.lyl.linklist
* @ClassName: ReverseByDoublePointerTest
* @Description: 使用 双指针+辅助临时节点 实现单链表反转
* @Date: 2020-05-30 19:17
**/
public class ReverseByDoublePointerTest {
/**
* 使用 双指针+辅助临时节点 进行链表反转
* @param head
* @return 返回反转后的 head 头结点
*/
public static Node reverse(Node head) {
// 当前节点指针
Node current ;
// 前一节点指针
Node previous;
// 当前节点指针初始化指向头结点
current = head;
// 前一节点指针初始化为 null
previous = null;
while(current != null){
// 辅助的临时节点, 存储当前节点的下一个节点
Node temp = current.next;
// 当前节点的下一个节点指向了前一个节点指针指向的节点
current.next = previous;
// 然后 前一节点指针向前移动一个节点,此时和当前节点指针都指向了当前节点
previous = current;
// 当前节点指针也向前移动一个节点,也就是移动到了当前节点的下一个节点,就是临时节点指向的节点
current = temp;
}
// 返回头结点
return previous;
}
// test
public static void main(String[] args) {
// 创建单链表
Node head = Node.createLinkedList();
// 遍历新创建的单链表
System.out.print("新创建的单链表: ");
Node.traverse(head);
// 递归反转单链表
Node newHead = reverse(head);
// 遍历反转后的单链表
System.out.print("反转后的单链表: ");
Node.traverse(newHead);
}
}
2.用过Redis吗?
(1)Redis的使用场景:
热点数据缓存、消息队列、分布式锁、排行榜、延时操作、计数器等
(2)Redis的常见数据类型:
String、List、Hash、Set、Sorted Set
(3)Redis与数据库缓存一致问题:
缓存与数据库同步的大致的流程如图所示:
下面是删除数据时,出现缓存数据库数据不一致的两种情况:
情况一、删除数据时,先删缓存,再更新数据库。
先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不一致发生。
解决方案:延时双删
延时双删的方案的思路是,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数据库之后,再 Sleep 一段时间,然后再次删除缓存。
情况二、先更新数据库,再删除缓存
先更新数据库,再删除缓存。更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存中读取到的就是旧值,还是会发生不一致。
解决方案:消息队列
先更新数据库,成功后往消息队列发消息,消费到消息后再删除缓存,借助消息队列的重试机制来实现,达到最终一致性的效果。
(4)什么是缓存穿透、缓存击穿和缓存雪崩:
缓存穿透:是指查询一个数据库一定不存在的数据。
缓存击穿:只会出现在热点数据上,发生在缓存失效的瞬间。
缓存雪崩:大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。
3.了解kafaka吗?对中间件有了解吗?
1)Kafka
Apache Kafka 是一款开源的消息系统。可以在系统中起到“肖峰填谷”的作用,也可以用于异构、分布式系统中海量数据的异步化处理。一共包含4个API:
Producer API:允许一个应用推送流记录通过一个或多个Kafka topics ;
Consumer API:允许一个应用订阅一个或多个topics 并且处理这些流记录;
Streams API:允许一个应用作为一个流处理者,通过topics 输入或输出流数据 ;
Connector API:绑定并运行 Producer 或 Consumer 连接Kafka topics 到 到已经存在的系统或存储上;
2)常用的中间件:
-
接入层中间件:nginx、openrestry、tomcat
-
缓存中间件:guava、redis
-
文件存储中间件:fastdfs、hdfs、oos、ES
-
数据库中间件:mycat、shardingsphere
-
消息中间件:Kafka、Rabbitmq、Rocketmq
-
搜索中间件:ES
-
引擎类中间件:Drools、URule、Activiti、Jflow
-
调度类中间件:xxljob、Azkaban、Airflow、Oozie、elastic-job、Jenkins
-
服务治理中间件:Zookeeper、nacos
-
AMP中间件( Application Performance Management):zipkin、大众cat、skywalking
-
大数据中间件:hadoop、cdh、ambari、spark、flink、hive、hbase-phoenix、kylin、es
4. url输入到浏览器发生什么?
总体来说分为以下几个过程:
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP or HTTPS 请求
- 服务器处理请求并返回响应(这里可以简要介绍MVC架构数据流转)
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手
5.如何测试电梯?
从黑盒测试的角度去思考:
- 功能:关注电梯的基本功能是否实现
- 性能:关注电梯的性能指标,如负重多少kg
- 安全性:关注电梯的安全性,如超重报警,下坠制动
- 用户体验:关注电梯的舒适性
白盒角度或其他角度去思考:
- 效率:关注电梯控制逻辑的内部算法
- 接口:电梯和电梯控制器,电梯和大楼,电梯和摄像头,电梯和对讲机(报警装置)的接口测试
- 零件:电梯的零件的单元测试
- 兼容性:电梯和其他东西的兼容性
tips:回答测试用例设计的面试题时的注意事项
- 一定要明确测试用例设计的范围,这个阶段可以多向面试官询问测试需求、测试范围。
- 明确系统的边界值以及核心的功能点,展开测试设计。
- 不要张口就答,可以先在稿纸上画出大概的脑图,根据脑图,捋顺思路再做答。
6.为什么投测开?
…按自身情况回答
7.内外网地址转换
通过NAT技术进行转换,
NAT(Network Address Translation),中文名唤作网络地址转换,诞生于IP地址匮乏的时代。
NAT的基本思想是ISP(Internet服务提供商)为每个家庭或者公司分配一个IP地址,这个IP地址用作Internet流量的传输,也就是大家常说的外网IP地址或者公网IP地址。在客户网络的内部,每台计算机有唯一一个IP地址,即内网IP地址,这些地址主要用于路由内部流量。当一个数据包离开客户网络发送至其他ISP时,需要进行地址转换,把唯一的内网IP地址转换成外网的IP地址。
8.https证书机制
客户端向服务端发起https链接,服务端返回服务端证书。
证书的主要内容有公钥(Public Key)、ISSUER(证书的发布机构)、Subject(证书持有者)、证书有效期、签名算法、指纹及指纹算法。
客户端收到证书后需要做证书的验证工作。首先获取ISSUER的公钥,将加密了的指纹解密,同时计算证书内容的指纹,比对两者的内容,如果内容一致,说明服务端可信。
整个解密过程就是完成了一次签名的认证,证明这个证书是权威的发证机构颁发的(指纹用机构的私钥加密了),并且证书内容没有经过修改(指纹相符)。那么证书中持有者一定是权威机构认证的公司或者个人。
客户端生成对称加密算法使用的秘钥,将请求参数用服务端的公钥加密后传送给服务端。
服务端解密,之后使用对称秘钥通信,返回给客户端加密后的数据。
9.测开职业规划
…按自身情况回答
10.数据库索引建立如何选择?占用空间不?
索引建立的选择:
- 频繁搜索、查询选择的列
- 经常排序、分组的列
- 经常用于连接的列(主键、外键)
不适合建立索引的情况:
- 仅包含几个值的列
- 表中仅包含几行
索引虽然能够提高查询效率,但是索引是需要占用空间的。
11.一组有序元素,选择哪种排序算法?为什么选择快速排序?若使用冒泡排序,最好时间复杂度是多少?冒泡排序最坏时间复杂度?
几乎有序的一组元素,建议用插入排序算法。
12.讲讲实习工作内容是啥?
应该没有了,就这些。
感谢有这次面试机会。
如果这篇文章对你有帮助,请给我点个三连!👍这样我才有动力继续更新下去!
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。