快手2020校园招聘秋招笔试--工程B试卷 订正

1.三种攻击
DNS欺骗攻击:冒充域名 把原来查询的IP改为其他IP
ddos攻击:大量合法的服务器向某一目标不断发送请求,导致其他用户无法使用
SYN Flooding攻击:攻击者使用无效IP地址 利用TCP三次握手过程,连续发送回话请求,直至连接超时,最终因耗尽资源而停止响应
2.TCP状态
SYN表示建立连接
FIN表示关闭连接
ACK表示响应
PSH表示有DATA数据传输
RST表示连接重置 用来强制关闭
那么什么时候发送RST包呢 如下几种情况 1.建立连接的SYN到达某端口 但是该端口上没有正在监听的服务 2. TCP收到了一个根本不存在的连接上的分节 3.请求超时 使用setsockopt的SO_RCVTIMEO选项设置recv的超时时间。接收数据超时时,会发送RST包。

3.堆排序
首先来讲二叉树 满二叉树就是 这个二叉树的节点要么是叶节点 要么有两个子节点 满的
完全二叉树是 除了最后一层外 其他层节点都满的(达到最大个数),然后 最后一层的节点都集中在左侧 (节点的编号与满二叉树是一致的)
这下我们来说堆 堆就是具有以下性质的完全二叉树: 每个节点的值都大于或者等于其左右孩子节点的值,为大顶堆 每个节点的值都小于或等于其左右孩子节点的值 叫做小顶堆
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

堆排序
堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn)
但是他的额外空间复杂度为O(1) 因为堆排序属于原地排序

再简单总结下堆排序的基本思路:
a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

7.对字符串HI_KWAI中的字符进行二进制编码,使得字符串的编码长度尽可能短,最短长度为18
哈弗曼编码
常用的二叉树概念 路径长度 节点的路径带权长度 树的路径带权长度
哈夫曼树就是在叶节点和权重都确定的情况下 带权路径长度最小的二叉树 也叫做最优二叉树

一堆节点(权值) 从最小的两个开始来合成父节点 (父节点的值是两个子节点的和) 然后删除掉两个子节点 留下叶节点 这样继续开始合并

8.计算无向图的度
总度数=边数*2

11.时间复杂度和空间复杂度的计算
还存在问题

12.A,B,C,D都为32位整型,基于以下给定的C,D能否得出A,B
存在越界问题 C+D=2A C-D都会导致越界 但是
C=A+B D=B 的时候 C-D=A A是32整型 所以不会越界 D直接等于B也不会越界

16.快速排序算法
快速排序算法就是先找到一个基准值 然后确定首尾为left和right 从right往前找到比它小的值赋给left left右移,否则right左移;再从left往后找比它大的值赋给right right左移 最后当left和right重合的时候把基准值赋给重合位置
这样进行一轮下来 基准值左边都比他小 右边都比他大

18.进程状态转换
运行态:进程占用CPU,并在CPU上运行;
就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
阻塞态:进程因等待某件事发生而暂时不能运行;
快手2020校园招聘秋招笔试--工程B试卷 订正_第1张图片
以上就是进程三种状态的转换示意

22.最长等差数列
给定一个未排序数组,找出其中最长的等差数列(无需保证数字顺序)。

我自己的代码如下:

#include
#include
#include
using namespace std;
 
bool isarith_part(vector<int>nums,int start,int end){
    int times=end-start;
    if(end-start<=1){return true;}
    int cur=start+1;
    while(end-cur>=1){
        if(nums[start+1]-nums[start]!=nums[cur+1]-nums[cur])
        {return false;}
    }
    return true;
}
 
int main(){
    int n;
    cin>>n;
    vector<int>nums;
    for(int i=0;i<n;i++){
        int temp;
        cin>>temp;
        nums.push_back(temp);
    }
    int max_len=5;
    for(int i=0;i<n;i++){
        for(int j=i;j<i;j++){
            vector<int>ttemp=nums;
            sort(ttemp.begin()+i,ttemp.begin()+j);
            if(isarith_part(ttemp,i,j)){
                int tt=j-i+1;
                max_len=max(max_len,tt);
            }
        }
    }
    cout<<max_len<<endl;
    return 0;
}

24.编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (: 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

你可能感兴趣的:(企业真题笔记)