2021年6月7日-6月10日,TPLINK22提前批网络安全算法工程师面试题3道

150 阅读3分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

1 TCP和UDP的特点

  • TCP:面向连接

TCP面向连接通信,所以握手过程会消耗资源,过程为可靠连接,不会丢失数据,适合大数据量交换 ;“面向连接”就是在正式通信前必须要与对方建立起连接。

TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。

TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。

  • UDP:面向非连接的

UDP面向非可靠连接,会丢包,没有校验,速度快,无须握手过程;"面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。

UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

总结:

  • TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
  • UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

2 25匹马 5个跑道,每次只能跑5匹,至少需要多少次才能选出最快的前3匹?

将马分成A、B、C、D、E五组。

  • 第1-5次比赛:各组分别进行比赛,决出各组名次,取每组前三名

A1、A2、A3

B1、B2、B3

C1、C2、C3

D1、D2、D3

E1、 E2、E3

  • 第6次比赛:A1、B1、C1、D1、E1,即每组的第一名进行比赛;

假设得到的排名结果是A1、B1、C1、D1、E1;其中A1是跑的最快的,那么A组A2、A3,B组的B1、B2以及C组的C1都是有机会进入前三的,C2没有希望冲进前3了,因为C1是比赛的名次已经是第3名了,此外D组E组都没有希望进入前3。现在已经知道A1肯定是第1名,剩下A2、A3、B1、B2、C1是有希望冲进前三的,那么让他们再进行一场比赛即可;

  • 第7次比赛:A2、A3、B1、B2、C1比赛求出第2,第3即可。

所以公共需要7厂比赛,就可以选出最快的前3匹马;

3 用rand5实现rand7

rand5(5):等概率生成整数[1, 2, 3, 4, 5]

rand5(7): 等概率生成整数[1, 2, 3, 4, 5, 6, 7]

思路:

      • 用(rand5(5) - 1)构造等概率整数数组:[0, 1, 2 , 3, 4],
      • 用(rand5(5) - 1)*5构造整数数组:[0, 5, 10, 15, 20],
      • 上面的两个整数组可以构造等概率的新数组:[0, 1, 2, 3, 4, 5, 6, 7, .... , 24];

(如果第2个数组选择2倍或者3倍,4倍则无法构造新的等概率数组)

      • 选择新数组[0, 1, 2, 3 .... , 20]21个元组即可构造等概率的数组[1, 2, 3, 4, 5, 6, 7]

参考代码:

import random


def rand5():
    return random.randint(1, 5)


def rand7():
    while True:
        tmp_num = (rand5() - 1)*5 + (rand5() - 1)
        if tmp_num <= 20:
            break
    return tmp_num % 7 + 1


# 随机生成10000个1~7的整数,验证0~7各个数字生成的概率;
ls = []
for _ in range(10000):
    ls.append(rand7())
for i in range(1, 8):
    print(ls.count(i)/len(ls), end=" ")
# out:0.144 0.1459 0.14 0.1438 0.1444 0.1373 0.1446
# 观察可知0~7各个数字生成的概率是