目录
选择题
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
编程题
1. 左右最值最大差
2. 顺时针打印矩阵
选择题
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;
}
}