青训营期间的面试记录(前端转全栈实习面经) | 青训营

103 阅读8分钟

到底面的什么岗位?

坐标:成都晓多科技

岗位:前端转全栈(hr是这么说的)

直接开门见山,面试题目是?

在此仅记录自己还记得住的题目以及给出相关知识点

1.下列TCP连接建立过程描述正确的是:

  • A. 服务端收到客户端的SYN包后等待2*ml时间后就会进入SYN_SENT状态

  • B.服务端收到客户端的ACK包后会进入SYN_RCVD状态

  • C.当客户端处于ESTABLISHED状态时,服务端可能仍然处于SYN_RCVD状态

  • D.服务端未收到客户端确认包,等待2*ml时间后会直接关闭连接

正确答案 : C

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入[ESTABLISHED]状态,完成三次握手。

因此,根据第二次握手,A、B错误。 D、服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。所以D错误。

2.能携带cookie的协议有什么?

能够携带 Cookie 的协议主要是基于 HTTP 协议的。以下是一些常见的能够携带 Cookie 的协议:

  1. HTTP(Hypertext Transfer Protocol):HTTP 协议是 Web 应用最常用的协议之一,能够携带和管理 Cookies。通过 Set-Cookie 头部字段在服务器端将 Cookie 信息发送给客户端,在之后的请求中通过 Cookie 头部字段将 Cookie 信息发送回服务器。
  2. HTTPS(HTTP Secure):HTTPS 是通过 SSL/TLS 加密的 HTTP 协议,提供了更加安全的数据传输方式。与 HTTP 类似,HTTPS 也能携带和管理 Cookies。

除了以上协议,其他一些基于 HTTP 的协议、框架和技术也支持携带 Cookie,例如:

  1. WebSocket:WebSocket 是一种在单个长连接上进行全双工通信的协议,通常基于 HTTP/HTTPS 进行握手。在 WebSocket 连接建立后,可以使用类似 HTTP 的 Set-Cookie 和 Cookie 头部字段进行 Cookie 的传递和管理。
  2. RESTful API:RESTful API 基于 HTTP 协议设计,通过使用 HTTP 请求方法(如 GET、POST、PUT、DELETE 等)来进行资源操作。在使用 RESTful API 进行通信时,可以在请求头部中添加 Cookie 字段以传递和管理 Cookies。

需要注意的是,不同的协议对于 Cookie 的管理和使用可能会有一些差异。此外,为了确保隐私和安全性,使用 Cookie 时应当遵循相关的隐私政策、安全设置和最佳实践。

3.脑筋急转弯:一共八个乒乓球,有一个比其他的重,只有一个称,最少称多少次能找出那个重的球?

答案 :2次

将八个球分成 3、3、1、1,先称量3个和3个,如果称平了,说明重的球在1和1中;如果没有平,则在重的那一侧三个球里面任选两个再称一次即可得到答案。

4.堆排序插入一个元素的时间复杂度是?

堆排序的插入一个元素的时间复杂度为O(log n)。

堆排序是一种基于二叉堆数据结构的排序算法,通常使用最大堆(Max Heap)来进行排序。堆的插入操作会将新元素添加到堆的末尾,然后进行上浮操作,以保持堆的性质。

在最大堆中插入一个元素的过程如下:

  1. 将元素添加到堆的最后一个位置。
  2. 将该元素与其父节点进行比较,如果该元素大于父节点,则交换它们的位置。
  3. 重复步骤2,直到满足堆的性质或者到达堆的根节点位置。

最大堆的插入操作的时间复杂度主要取决于堆的高度,即树的高度。由于堆是一个完全二叉树,其高度为log n,其中n是堆中元素的数量。因此,在最坏情况下,插入一个元素的时间复杂度为O(log n)。

需要注意的是,堆排序通常在建堆阶段就将所有元素插入堆中,并不逐个插入元素进行排序。因此,整个堆排序的时间复杂度为O(nlog n)。

常见排序算法的时间复杂度 :

以下是几种常见排序算法的时间复杂度(最坏情况下):

  1. 冒泡排序(Bubble Sort):O(n^2) 冒泡排序是一种简单但低效的排序算法,它通过不断交换相邻元素来将最大的元素逐步冒泡到数组末尾。最坏情况下,需要进行大约 n^2/2 次比较和交换操作。
  2. 选择排序(Selection Sort):O(n^2) 选择排序从未排序的部分中选择最小(或最大)元素,并将其放在已排序部分的末尾。最坏情况下,需要进行大约 n^2/2 次比较和 n 次交换操作。
  3. 插入排序(Insertion Sort):O(n^2) 插入排序从无序部分逐个将元素插入到已排序部分的正确位置。最坏情况下,需要进行大约 n^2/2 次比较和 n^2/2 次移动操作。
  4. 希尔排序(Shell Sort):O(n log n) - O(n^2) 希尔排序是一种改进的插入排序算法,通过插入排序的多次操作来减少逆序对的数量。希尔排序的时间复杂度取决于所选择的间隔序列(gap sequence)。最坏情况下,取决于间隔序列的选择,时间复杂度可以达到 O(n^2)。
  5. 归并排序(Merge Sort):O(n log n) 归并排序采用分治法,将数组逐步划分为较小的子数组,然后通过合并有序子数组来实现排序。最坏情况下,归并排序的时间复杂度是稳定的,为 O(n log n)。
  6. 快速排序(Quick Sort):O(n log n) 快速排序也是一种分治算法,通过选择一个基准元素,将数组划分为较小和较大的两个子数组,然后对子数组进行递归排序。最坏情况下,如果每次划分都不平衡,时间复杂度为 O(n^2)。但通常情况下,平均时间复杂度稳定在 O(n log n)。
  7. 堆排序(Heap Sort):O(n log n) 堆排序使用堆这种数据结构来进行排序,通过构建最大堆或最小堆,并反复从堆中提取根节点来获取有序序列。最坏情况下,堆排序的时间复杂度是 O(n log n)。

需要注意的是,以上时间复杂度是在最坏情况下的估计值,实际运行时的时间复杂度可能会受到不同因素的影响。

堆是什么?

堆是一种特殊的完全二叉树结构,它满足两个主要性质:堆属性和完全二叉树属性。

  1. 堆属性(Heap Property):

    • 对于最大堆(Max Heap),对于堆中的任意节点 i,其父节点的值大于等于节点 i 的值。
    • 对于最小堆(Min Heap),对于堆中的任意节点 i,其父节点的值小于等于节点 i 的值。
  2. 完全二叉树属性(Complete Binary Tree Property):

    • 除了最底层,其他层的节点数都达到最大,且最底层的节点都集中在左侧。

在堆中,根节点是最大(或最小)值,并且在最大堆中,任意子树的根节点的值都大于等于子树中的其他节点。这使得堆可以用于高效地进行排序和优先级队列操作。

堆常见的操作包括:

  • 插入元素:将新元素插入到堆的末尾,然后通过上浮操作将其调整到合适的位置,以维持堆的属性。
  • 删除根节点:将根节点与最后一个节点交换,然后删除最后一个节点,并通过下沉操作将新的根节点调整到合适的位置,以维持堆的属性。
  • 构建堆:将一个无序的数组或列表构建成一个堆,通常使用自底向上的方法进行调整。
  • 堆排序:利用堆的属性,可以通过反复删除根节点并调整堆的操作来获得一个有序的序列。

堆可以用数组或列表来表示,其中每个元素对应堆中的一个节点。通过索引的关系,可以方便地在数组中进行堆的操作,并且可以在相应的索引位置上计算出子节点和父节点的索引。