华为108题中涉及到的P地址和子网掩码相关问题及牛客网链接如下:
1 识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682?tpId=37&tqId=21241&tPage=1&rp=&ru=/ta/huawei&qru=/ta/huawei/question-ranking
2 整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea?tpId=37&tqId=21256&tPage=2&rp=&ru=/ta/huawei&qru=/ta/huawei/question-ranking
3 判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218?tpId=37&tqId=21262&tPage=2&rp=&ru=/ta/huawei&qru=/ta/huawei/question-ranking
4 合法IP
https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9?tpId=37&tqId=21313&tPage=5&rp=&ru=/ta/huawei&qru=/ta/huawei/question-ranking
解题
1 识别有效的IP地址和掩码并进行分类统计
import java.util.*;
import java.io.*;
public class Main {
/*
对于子网掩码的判断,平台通过的代码中有很多也是对子网掩码的理解有误差,以下几行代码完全可以省略掉
else if (mask_arr[0].equals("254") || mask_arr[0].equals("252") || mask_arr[0].equals("248") ||
mask_arr[0].equals("240") || mask_arr[0].equals("224") || mask_arr[0].equals("192") ||
mask_arr[0].equals("128") || mask_arr[0].equals("0")) {
return mask_arr[1].equals("0") && mask_arr[2].equals("0") && mask_arr[3].equals("0");
}
同时对ip是否合法判断的健壮性不足
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//a b c d e 类
int a = 0, b = 0, c = 0, d = 0, e = 0;
int err = 0;//错误类别
int pri = 0;//私网
String str;
String[] ip_mask;
String[] ip;
int i;
while ((str = br.readLine()) != null) {
ip_mask = str.split("~");
ip = ip_mask[0].split("\\.");
if (checkMask(ip_mask[1])) {
//私有IP地址和A,B,C,D,E类地址是不冲突的,所以要在判断ABCDB的过程中判断私网地址
if (checkIP(ip)) {
i = Integer.parseInt(ip[0]);
if (i >= 1 && i <= 126) {
// A
a++;
if (i == 10) {
pri++;
}
} else if (i >= 128 && i <= 191) {
// B
b++;
if (i == 172 && Integer.parseInt(ip[1]) >= 16 && Integer.parseInt(ip[1]) <= 31) {
pri++;
}
} else if (i >= 192 && i <= 223) {
// C
c++;
if (i == 192 && Integer.parseInt(ip[1]) == 168) {
pri++;
}
} else if (i >= 224 && i <= 239) {
// D
d++;
} else if (i >= 240 && i <= 255) {
// E
e++;
}
} else {
err++;
}
} else {
err++;
}
}
// output
System.out.println(a + " " + b + " " + c + " " + d + " " + e + " " + err + " " + pri);
}
//判断子网掩码的合法性
private static boolean checkMask(String mask) {
//因为.也属于转义符,要注意切分时候的格式
String[] mask_arr = mask.split("\\.");
if (mask_arr[0].equals("255")) {
if (mask_arr[1].equals("255")) {
if (mask_arr[2].equals("255")) {
return mask_arr[3].equals("254") || mask_arr[3].equals("252") || mask_arr[3].equals("248") ||
mask_arr[3].