面试经历记录

博主记录了一次面试经历,此次面试侧重数据结构和计算机网络,未涉及项目经历。面试问题包括链表找中间节点、二叉树层次遍历、快速排序和二分查找算法过程,以及TCP连接过程和TCP/IP协议等,博主回答欠佳,打算积累经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次面试直接被问懵,和前两次的完全不一样,侧重点在数据结构和计算机网络,项目经历完全没有提。回答的一塌糊涂,内心仍然处于懵逼状态,还是认真的记录本次经历,积累经验吧。

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:释放一个连接。

三次握手:

  1. 在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;
  2. 第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;
  3. 第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

四次挥手:

  • 由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,
  • 收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。
  1. 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  2. 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  3. 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

6.TCP/IP协议

我回答的tcp/ip四层协议,分别把每一层都讲一下,结果被面试官质疑说从哪儿学的tcp/ip协议是四层???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值