本次面试直接被问懵,和前两次的完全不一样,侧重点在数据结构和计算机网络,项目经历完全没有提。回答的一塌糊涂,内心仍然处于懵逼状态,还是认真的记录本次经历,积累经验吧。
1.链表找中间节点
遍历一次链表,然后建立两个指针,第一次指向next,第二个指向next➡next,然后同时进行循环,当第二个走向尾节点时,第一个指针所对的next则为中间节点
代码如下:
class Solution:
def middleNode(self, head):
fast = slow = head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
return slow
2.二叉树的层次遍历
口述层次遍历的伪代码,不仅仅是算法思想
算法思想:首先我们知道层次遍历就是对二叉树的每一层进行遍历,首先我们遍历根节点,将根节点放入队列中,然后根节点出队列,访问根节点,然后判断根节点是否有左右子树,如果有,则将左右子树的根节点依次存入队列,然后左子树的根节点首先出队列,访问它,如果左子树的根节点还有子节点,则依次进入队列,右子树的根节点出队列,访问它,依次循环,则可成功层次遍历所有结点。
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
ret = []
queue = [root]
while queue:
levelret = []
n = len(queue)
for i in range(n):
node = queue.pop(0)
levelret.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
ret.append(levelret)
return ret
3.快速排序的算法过程
口述快速排序的伪代码以及时间复杂度
时间复杂度为:O(nlogn)
def quick_sort(ary):
return qsort(ary,0,len(ary)-1)
def qsort(ary,left,right):
#快排函数,ary为待排序数组,left为待排序的左边界,right为右边界
if left >= right : return ary
key = ary[left] #取最左边的为基准数
lp = left #左指针
rp = right #右指针
while lp < rp :
while ary[rp] >= key and lp < rp :
rp -= 1
while ary[lp] <= key and lp < rp :
lp += 1
ary[lp],ary[rp] = ary[rp],ary[lp]
ary[left],ary[lp] = ary[lp],ary[left]
qsort(ary,left,lp-1)
qsort(ary,rp+1,right)
print(ary)
return ary
ary = [5,1,4,8,9,2,0,2,7,3]
quick_sort(ary)
4.二分查找的算法过程
例如从100个数中查找一个数,需要几次,以及时间复杂度
时间复杂度:O(log2n)
def binary_search(num_list, x):
'''
二分查找
'''
left, right = 0, len(num_list)-1
while left < right:
mid = (left + right) // 2
if num_list[mid] > x:
right = mid
elif num_list[mid] < x:
left = mid + 1
else:
return '待查元素{0}在列表中下标为:{1}'.format(x, mid)
return '待查找元素%s不存在指定列表中'%x
if __name__ == '__main__':
num_list = [2, 6, 6, 9, 17, 21, 23, 30, 33, 34, 56, 78, 83, 99, 177]
print(binary_search(num_list, 34))
print(binary_search(num_list, 985))
5.TCP连接过程(其中信号包名称)
tcp连接的三次握手以及四次挥手过程,以及握手时发送的信号包名称
两个序号和三个标志位:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
三次握手:
- 在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;
- 第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;
- 第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。
四次挥手:
- 由于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状态,完成四次挥手。
6.TCP/IP协议
我回答的tcp/ip四层协议,分别把每一层都讲一下,结果被面试官质疑说从哪儿学的tcp/ip协议是四层???