实习凉面经历

做个刷怪记录

2021.3.10 阿里研发岗实习笔试

1. 根据犯人初始位置和一系列指令,判断犯人最终位置。(直接模拟)
2. 一个环形数组,数组长度为3的整数倍。小明从数组中循环抽取数字,每次抽取后数组将删除该位置及其两侧位置的数值。求小明最终能获得的最大数值和。
  leetcode1388题
  问题可以等价转化为:给一个长度为 3n 的环状序列,你可以在其中选择 n 个数,并且任意两个数不能相邻,求这 n 个数的最大值
  解法:动态规划。用 dp[i][j] 表示在前 i 个数中选择了 j 个不相邻的数的最大和。考虑选择当前数或者不选择当前数进行状态转移:
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 2 ] [ j − 1 ] + n u m [ i ] ) dp[i][j]=max(dp[i-1][j],dp[i-2][j-1]+num[i]) dp[i][j]=max(dp[i1][j],dp[i2][j1]+num[i])
   对于循环队列,遍历计算两次dp,第一次去除第一个元素计算(等效不选取第一个元素),第二次去除最后一个元素计算。最终结果为两次 dp 最大值。

2021.3.10 腾讯云研发岗实习初试(凉了)

1. TCP三次握手过程及客户机和服务器的TCP进程状态。

  解答:假设A运行TCP客户进程,B运行TCP服务器进程。

  1. A和B的TCP进程分别创建传输控制模块TCB,且B的服务器进程处于LISTEN(收听)状态
  2. A向B发出连接请求报文,首部中的同步位 SYN=1,选择初始序列号 seq=x,SYN报文不能携带数据,但是要消耗掉一个序号。A的TCP客户进程进入SYN-SENT(同步已发送)状态
  3. B回复确认报文,SYN=1,ACK=1,确认号 ack=x+1。并为自己选择初始序列号 seq=y,该报文不携带数据,同时消耗一个序号。B的TCP服务器进程进入SYN-RCVD(同步收到)状态
  4. A再次回复确认报文,ACK=1,确认号 ack=y+1,序列号seq=x+1。ACK报文可以携带数据,不携带数据则不消耗序列号。此时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态
  5. B收到A的确认,进入ESTABLISHED状态。

2. TCP报文段表头和IP数据报表头组成。TTL作用。

  • TCP报文段首部:源端口号目的端口号序号使用 m o d ( 2 32 ) mod (2^{32}) mod(232)运算,TCP面向字节流,每一个字节按顺序编号;确认号是期望收到对方下一个报文段的第一个数据字节的序号;数据偏移指本报文数据起始处与本报文开始位置的距离(最大值为15*4=60字节);确认ACK,在建立连接后所有报文的ACK都置1;同步SYN,建立TCP连接时使用;终止FIN,释放连接时使用。窗口是发送方的接收窗口大小;校验和校验伪首部+首部+数据。
  • IP数据报首部:版本首部长度总长度表示首部和数据之和,单位字节;标志用于分片后数据报的组装;标志,MF=1表示还有分片,DF=1表示不能分片;片偏移表示该片在原数据报中的相对位置,以8字节为单位;生存时间TTL防止无法交付的数据报无限制兜圈;协议指明携带的数据使用什么协议;首部校验和,只检验数据报首部不包括数据部分。

3. 什么是拥塞,TCP拥塞控制方法。

  • 拥塞:某段时间内,对网络中的某一资源的需求超过了该资源所能提供的可用部分,导致网络性能变坏。
  • TCP拥塞控制方法:初始时拥塞窗口 cwnd 大小置为1,开始执行慢开始算法,每收到一个确认后,拥塞窗口大小加倍。达到慢开始门限 ssthresh 后,开始执行拥塞避免算法,每收到一个确认后,拥塞窗口大小 + 1。发生超时后, ssthresh = cwnd / 2,cwnd = 1,开始执行慢开始算法。收到3个重复确认后,cwnd = ssthresh = cwnd / 2,开始执行拥塞避免算法。

4. Linux tail指令,如何自己实现访问文件的最后几行。

  • 使用滑动窗口进行查找,当滑动窗口到底时,输出文件内容。
tail [参数] [文件]
-f 循环读取
-c<数目> 显示的字节数
-n<行数> 显示文件的尾部 n 行内容

tail notes.log   //默认显示文件最后10行
tail -n +20 notes.log  //显示第20行至文件末尾

5. 快排实现。

  • 基本思想:随机找出一个数,可以随机取,也可以取固定位置,一般是取第一个或最后一个称为基准,然后就是比基准小的放在左边,比基准大的放到右边。如何放呢?就是和基准进行交换,这样交换完左边都是比基准小的,右边都是比较基准大的,这样就将一个数组分成了两个子数组,然后再按照同样的方法把子数组再分成更小的子数组,直到不能分解为止。
  • python实现
def QuickSort(nums:list, left:int, right:int):
    if left < right:
        position = findPosition(nums, left, right)
        QuickSort(nums, left, position-1)
        QuickSort(nums, position+1, right)

def findPosition(nums:list, leftIndex:int, rightIndex:int):
    '''寻找基准位置'''
    initNum = nums[leftIndex]
    left = leftIndex
    right = rightIndex
    while (left < right):
        while(left < right and nums[right] > initNum):
            right -= 1
        while(left < right and nums[left] <= initNum):
            left += 1
        if left != right:
            swap(nums, left, right)
    swap(nums, left, leftIndex)
    return left

def swap(nums:list, left:int, right:int):
    '''交换两位置元素'''
    temp = nums[left]
    nums[left] = nums[right]
    nums[right] = temp
        
if __name__ == "__main__":
    a = [1, 5, 7, 2, 6, 3, 9, 4]
    QuickSort(a, 0, len(a)-1)
    print(a)
  • Java实现
import java.util.Arrays;

public class QuickSort {
   
    public static void main(String[] args) {
   
        int[] a = {
   1, 4, 2, 6, 8, 4, 5, 7};
        quickSort(a, 0, a.length-1);
        System.out.println(Arrays.toString(a));
    }

    public static void quickSort(int[] array, int left, int right) {
   
        if (left < right) {
   
            int position = searchPosition(array, left, right);
            quickSort(array, left, position-1);
            quickSort(array, position+1, right);
        }
    }

    public static int searchPosition(int[] array, int leftIndex, int rightIndex) {
   
        int initNum = array[leftIndex];
        int left = leftIndex;
        int right = rightIndex;
        while (left != right) {
   
            while(left < right && array[right] > initNum) {
   
                right--;
            }<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值