目录
选择题
1.
/etc/resolv.conf 是 DNS 解析的设置文件。
2.
ping 是 TCP/IP 协议的一部分,使用 ICMP 协议,ICMP 底层使用 IP 协议,主要用来检测网络是否通畅,如果要 ping 其他网段,则需要设置网关。
DNS 设置错会影响访问公网服务器的域名,而不会影响内部子设备是否 ping 通。
ping 命令是跨操作系统的,windows 主机能够 ping 通 Linux 主机。
二层交换机如果出现故障那么同网段主机则不会 ping 通。
3.
Dos 攻击被称之为拒绝服务攻击,其目的是使计算机或网络无法提供正常的服务。最常见的 Dos 攻击有计算机网络宽带攻击和连通性攻击。
Dos 攻击中并不包括侵入目标服务器或目标网络设备。
Dos 是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段残忍的耗尽被攻击对象的资源。
4.
将 IP 地址解析成 MAC 地址是 ARP 协议,并且 ARP 协议是向子网内主机进行广播 ARP 请求,目标主机收到之后,回复 ARP 应答。
5.
可以在私网当中查看到同事的电脑,说明在局域网内通信没有问题。
能成功登录 QQ,说明访问 QQ 的服务器没有问题,也就是说,访问外网(互联网)是通的。
但是访问不了一个特定的域名,所以问题出在了域名转换成为 IP 的过程,所以问题出在 DNS。
6.
A 类网络默认的子网掩码:255.0.0.0
B 类网络默认的子网掩码:255.255.0.0
C 类网络默认的子网掩码:255.255.255.0
子网掩码,网络和子网部分是 1,主机部分是 0,2^4 < 20 < 2^5,子网就占 5 个比特位
所以子网掩码:255.255.255.11111000 所以就是 255.255.255.248。
7.
400: 请求报文中出现了语法错误。
404:找不到请求资源。
302:临时重定向,要访问的资源变成了新的 URL,浏览器收到应答后会访问新的 URL,所以会产生两次 HTTP 请求。
304:服务端已经执行了GET,但文件未变化。(缓存)
8.
路由信息组成部分:1. 目的主机的网络地址 2. 下一个跳转的地址 3.子网掩码
-net 后面跟的是目标网络,gw 就是 gateway (网关入口),表示从哪个网关到哪个目标网络。
9.
三次握手,四次挥手。
10.
1xx 状态码表示请求被正常接收,会进行进一步处理。(100 表示继续。客户端应继续其请求)
2xx 表示成功,3xx 表示重定向(301 表示永久重定向),4xx 表示客户端错误。
编程题
1. 字符串计数
代码实现:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
String s1 = in.next();
String s2 = in.next();
int len1 = in.nextInt();
int len2 = in.nextInt();
print(s1, s2, len1, len2);
}
}
public static void print(String s1, String s2, int len1, int len2) {
// 可以将字符串看做 26 进制的数字。
// 这样问题就转化为了,求满足 s1 < x < s2,的 x 有多少个。
// 假设 s1 是 21,s2 是 32,则 x 有 32 - 21 - 1 = 10 个
// 也就是说,当长度为 2 的,并且在 s1 和 s2 之间的个数有 10 个
// 类比一下,a ~ z 是 26 个字母,也就是 26 进制,
// 将每个字母的差 * 对应的 26 的 n 次方,将其转化为 10 进制,就是结果
// 让 s1 和 s2 长度相等,补位补到 len2
// s1 补 a,s2 补 (z+1)
// 然后需要将 s2 和 s1 所对应的字符相减,并记录下来
// 再从 26 进制转化为 10 进制,既是最后的结果
// 如果 s1 不够 len2 位或者 s2 不够 len2 位,就需要补位
// s1 补 a,s2 补 (char)('z'+1)
while (s1.length() < len2 || s2.length() < len2) {
if (s1.length() < len2) {
s1 += 'a';
s2 += (char) ('z' + 1);
}
}
// 记录结果
long result = 0;
// 先将 s2 和 s1 的每个对应字符的差值存入 arr 中
long[] arr = new long[len2];
for (int i = 0; i < len2; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
arr[i] = c2 - c1;
}
// 然后再来计算每个长度有多少个
for (int i = len1; i <= len2; i++) {
// 然后再来计算, 将 26 进制转化为 10 进制
for (int j = 0; j < i; j++) {
// 计算当长度为 i 时, x 的取值范围
long tmp = tmp = arr[j] * (long) Math.pow(26, i - j - 1);
result += tmp;
}
}
System.out.println((result - 1) % 1000007);
}
}
2. 最长公共子序列
求两字符串最长公共子序列是面试官喜欢考察的非常经典的动态规划类型的题目。
思路:1. 问题 2. 定义状态 3. 状态转移方程 4. 初始化 5. 返回结果
根据以上思路,我们就可以写代码了。
代码实现:
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.hasNext()) { // 注意 while 处理多个 case
String m = in.next();
String n = in.next();
int count = LCS(m, n);
System.out.println(count);
}
}
public static int LCS(String m, String n) {
// dp[i][j] 表示以 m 的 i 下标结尾和以 n 的 j 下标结尾的最长公共子序列的长度
int ml = m.length();
int nl = n.length();
// 要考虑字符串为空的情况
int[][] dp = new int[ml + 1][nl + 1];
// 初始化, 空串没有子序列长度
dp[0][0] = 0;
for (int i = 0; i <= ml; i++) {
// 如果其中一个串为空串,则最长子序列长度为 0
for (int j = 0; j <= nl; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else {
// 如果 m[i - 1] == n[j - 1],则最长公共字串为 dp[i - 1][j - 1] + 1
if (m.charAt(i - 1) == n.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
// 如果两个字符不相等,则 dp[i][j] 为 dp[i - 1][j] 和 dp[i][j - 1] 的最大值
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
}
return dp[ml][nl];
}
}