目录
选择题
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
编程题
1. 数据库连接池
2. mkdir
选择题
1.
2.
数据的五元组:源IP,源端口,目的IP,目的端口,协议。
源IP:描述数据从哪个主机上产生。
目的IP:描述数据去往哪个主机。
源端口:描述数据从源主机的哪个进程产生。
目的端口:描述数据去往目的主机的哪个进程。
协议:双方网络通信使用的网络协议。
源端口地址:源IP + 源端口
目的端口地址:目的IP + 目的端口
在 TCP/UDP 传输段中,源端口地址和目的端口地址是不能相同的,否则就会建立自己到自己的连接,白白耗费资源。网络攻击中的 LAND 攻击就是利用这个这一点进行攻击的。
3.
154.27.0.0 是 B 类 IP 地址(B类主机地址范围:128.0.0.1 到 191.255.255.254,前两字节是网络地址,后两字节是主机地址),不做子网划分,主机号就有 2^16(65536) 个,除去全 0 (网段号154.27.0.0) 和全 1 (广播号154.27.255.255) ,可以支持 65534 台主机。
4.
简单网络管理协议(SNMP) 是 TCP/IP 模型的一个应用层协议。
应用层:文件传输协议(FTP),远程登录协议(Telnet),电子邮件协议(SMTP),网络文件服务协议(NFS),网络管理协议(SNMP),域名解析协议(DNS)。
传输层:TCP,UDP 协议。
网络层:IP,ICMP,ARP,RARP。
5.
5xx 的状态码是服务器出错,4xx 的状态码是客户端出错,3xx 的状态码是重定向,2xx 状态码是成功。
6.
因为第一个数据包丢失,B 会重新向主机 A 索要第一个数据包(确认号为 70),而不是返回 100,如果返回了 100,就说明 B 已经完整接收到了 100 以及之前的数据包,这样主机就不会重传了。
7.
主机名本质上就是域名,比如 www.jd.com,将域名转为 IP 地址的过程就是域名解析。
8.
MIME(多用途互联网邮件扩展类型),是设定某种扩展名的文件,用一种应用程序来打开的方式类型,当该扩展名被访问的时候,浏览器会自动使用指定应用程序来打开。
HTTP 请求中 host 才是表示初始 URL 中的主机和端口。css 是页面的样式。
9.
在同一信道上同一时刻,可进行双向数据传送的通信方式是全双工。
TCP 协议是有连接的,UDP 是无连接的。
OSI 结构是:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
网络号 = IP地址 & 子网掩码
(255 是全 1)
192.168.8.123 (01111011)
&
255.255.255.248 (11111000)
=
192.168.8.120 (01111000)
10.
404 是找不到资源,502 是错误网关。
403 是没权限拒绝访问,304 会读取浏览器缓存。
200 是成功,500 是服务器错误。
编程题
1. 数据库连接池
我们可以利用 set 来完成,先创建个 count 来记录需要创建的连接池数量,然后直接遍历数组,然后看看字符串的第一个字符(请求编号)是否在 set 中存在,如果不存在,则将字符放入 set 中,如果存在,那就先判断下当前 set 的 size 是否大于 count,如果大于,就更新 count,然后再将该字符从 set 中删除。
代码实现:
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
in.nextLine();
Set<Character> set = new HashSet<>();
int count = 0;
for (int i = 0; i < n; i++) {
String str = in.nextLine();
char c = str.charAt(0);
if (set.contains(c)) {
set.remove(c);
} else {
set.add(c);
if (set.size() > count) {
count = set.size();
}
}
}
System.out.println(count);
}
}
}
2. mkdir
看例子,如果输入的目录包含子目录,就需要将相同的目录和子目录剔除,如果不是子目录,就得按照字母顺序输出,因为要排序,所以我们可以先将数组排序,然后再遍历数组,比较两个目录,如果两个目录相同,就删除前一个目录,如果前一个目录是后一个目录的子目录(前目录长度小于后目录,并且后目录包含前目录,而且后目录包含前目录的下一个字符是 '/' ),就删除前一个目录。然后再次遍历数组,将未被删除的目录构造成命令输出即可。
代码实现:
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
String[] paths = new String[n];
for (int i = 0; i < n; i++) {
paths[i] = in.next();
}
// 首先对数组进行排序
Arrays.sort(paths);
// 然后遍历数组,剔除掉相同的目录和子目录
boolean[] flg = new boolean[n];// 用来标记数组中某些元素被删除
for (int i = 0; i < n - 1; i++) {
// 目录相同,剔除目录
if (paths[i].equals(paths[i + 1])) {
flg[i] = true;
}
// 剔除子目录,/a /ab /a/b
// /a/b 包含 /a,并且 /a/b 长度大于 /a,并且 /a/b 在 /a 的后一个字符是 /
if (paths[i + 1].contains(paths[i]) && paths[i + 1].length() > paths[i].length() && paths[i + 1].charAt(paths[i].length()) == '/') {
flg[i] = true;
}
}
// 最后构造命令并输出即可。
for (int i = 0; i < n; i++) {
if (!flg[i]) {
System.out.println("mkdir -p " + paths[i]);
}
}
System.out.println();
}
}
}