目录
选择题
1.
cookie 是浏览器存储数据的机制,是用于维护 http 通信当中客户端的用户信息的。
2.
403 Forbidden 表示资源不可用,服务器理解客户请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致的 web 访问错误。
3.
tcpdump 是抓包命令。
4.
/28 表示有 28 位网络号,172.16.22.00100110,黄色部分就是网络号,也就是 172.16.22.32。
主机号占 32 - 28 = 4 位,所以一共有 2^4 = 16 个主机地址。
范围就是 172.16.22.32 ~ 172.16.22.47,除去全 0(网络号)和全 1 (广播号) 后,还剩下 14 个主机地址。
5.
accept 表示获取一个已完成连接的操作句柄,而建立完连接则是三次握手完成之后。
6.
对于服务端来说,一个客户端的连接请求到来,创建一个新连接,新连接源端地址与监听连接绑定地址相同,只是对端地址不同,描述通信两端的信息,跟端口没有关系,所以理论上并没有限制,全凭主机的资源上限。
一个客户端主机上可以启动多少客户端程序(65536 ,一个客户端程序会占据一个端口)。
7.
URG 表示紧急指针是否有效,带外优先数据,紧急指针指向正常数据处也就是带外数据的下一个位置处。
ACK 是确认报文,SYN 是连接请求,FIN 是关闭连接请求。
8.
10.1.0.1/17:00001010.00000001.00000000.00000001
网络号就是 10.1.0.0
子网掩码:11111111.11111111.10000000.00000000
子网掩码取反得到最大主机号,也就是广播号 127.255
与网络号相加得到广播地址,所以广播号就是 10.1.127.255
9.
用于组建私网的网段有:10 网段和 172.16 ~ 172.31 网段以及 192.168 网段。
10.
listen 函数功能,开始监听,让指定套接字进入监听状态,表示可以开始处理客户端的连接请求。
如果黑客,伪造 IP 发送大量连接请求,服务端就会创建大量的套接字句柄用于与其通信,资源瞬间耗尽服务器崩溃,因此为了限制这种情况,就限制了同一时间所能处理最大连接数量。
listen 的第二个参数表示,内核中的已完成连接队列节点个数,表示同一时间最多能处理多少个客户端的连接请求。
编程题
1. 左右最值最大差
题目要求求 | 左部分最大值 - 右部分最大值 | 的最大值,因为是求绝对值,所以可以是左边 - 右边,也可以是右边 - 左边,所以左边最大值和右边最大值一定有一个是整个数组的最大值,所以我们可以先遍历数组,找到数组的最大值,其中一个最大值值就能确定了。就可以转化成数组最大值减去另一部分的最大值,因为求的是差的最大值,所以数组最大值确定了,那么另一个被减数就应该尽可能的小,也就是说求最大值的较小值(被减数)。
左部分:一定会包含 A[0] 这个元素,求最部分最小的最大值 x ,所以 x 一定是大于等于 A[0] 的
右部分:一定会包含 A[n - 1] 这个元素,求最部分最小的最大值 y ,所以 y 一定是大于等于 A[n - 1] 的
所以最小的最大值应该在 A[0] 和 A[n - 1] 中选,所以最后只需要遍历数组找出数组最大值 max,然后再用 max 减去 min(A[0] , A[n - 1] )即可。
代码实现:
import java.util.*;
public class MaxGap {
public int findMaxGap(int[] A, int n) {
// 求的是左边最大值与右边最大值的差的绝对值,最大是多少
// 则说明可以是 leftMax - rightMax
// 也可以是 rightMax - leftMax
// 而左右两边的最大值一定有一个是整个数组的最大值
// 而题目又说它们的差必须最大,则说明被减数一定要小
// 左边最小的最大值一定是比 A[0] 要大,或者相等
// 右边最小的最大值一定是比 A[n - 1] 要大,或者相等
// 所以最小的最大值一定在 A[0] 和 A[n - 1] 中选
// 所以最后就是遍历数组,找出数组最大值
// 再用数组最大值 - min(A[0], A[n - 1]) 即可
int max = Integer.MIN_VALUE;
for (int i = 0; i < A.length; i++) {
int tmp = A[i];
if (tmp > max) {
max = tmp;
}
}
return max - Math.min(A[0], A[n - 1]);
}
}
2. 顺时针打印矩阵
代码实现:
import java.util.*;
public class Solution {
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> ans = new ArrayList<>();
int x1 = 0, y1 = 0, x2 = matrix.length - 1, y2 = matrix[0].length - 1;
while (x1 <= x2 && y1 <= y2) {
// 第一行
for (int i = y1; i <= y2; i++) {
ans.add(matrix[x1][i]);
}
// 最后一列
for (int i = x1 + 1; i <= x2; i++) {
ans.add(matrix[i][y2]);
}
// 最后一行
if (x1 < x2) {
for (int i = y2 - 1; i >= y1; i--) {
ans.add(matrix[x2][i]);
}
}
// 第一列
if (y1 < y2) {
for (int i = x2 - 1; i >= x1 + 1; i--) {
ans.add(matrix[i][y1]);
}
}
x1++;
y1++;
x2--;
y2--;
}
return ans;
}
}