题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] counts = new int[7]; // A,B,C,D,E,Error,Private
while (scanner.hasNextLine()) {
String[] intput = scanner.nextLine().split("~");
String ip = intput[0];
String mask = intput[1];
classifyIpAndUpdateCounts(ip, mask, counts);
}
for (int count : counts) {
System.out.print(count + " ");
}
}
private static void classifyIpAndUpdateCounts(String ip, String mask,
int[] counts) {
if (!isValidIP(ip)) {
counts[5]++; // Error
return;
}
String[] ipParts = ip.split("\\.");
int firstOctet = Integer.parseInt(ipParts[0]);
if (firstOctet == 0 || firstOctet == 127) {
return;
}
if (!isValidSubnetmask(mask)) {
counts[5]++; // Error
return;
}
if (1 <= firstOctet && firstOctet <= 126) {
counts[0]++; //A
} else if (128 <= firstOctet && firstOctet <= 191) {
counts[1]++;//B
} else if (192 <= firstOctet && firstOctet <= 223) {
counts[2]++;//C
} else if (224 <= firstOctet && firstOctet <= 239) {
counts[3]++;//D
} else if (240 <= firstOctet && firstOctet <= 255) {
counts[4]++;//E
}
int secondOctet = Integer.parseInt(ipParts[1]);
if (firstOctet == 10 || (firstOctet == 192 && secondOctet == 168) ||
(firstOctet == 172 && (16 <= secondOctet && secondOctet <= 31))) {
counts[6]++;
}
}
private static boolean isValidIP(String ip) {
String[] parts = ip.split("\\.");
if (parts.length != 4) {
return false;
}
for (String part : parts) {
int ipTemp = Integer.parseInt(part);
if (!part.matches("\\d+") || ipTemp < 0 || ipTemp > 255) {
return false;
}
}
return true;
}
private static boolean isValidSubnetmask(String subnetMask) {
String[] octets = subnetMask.split("\\.");
if (octets.length != 4) {
return false;
}
int bitmask = 0;
// 将每个八位子网掩码转换为整数并添加到位掩码中
for (String octet : octets) {
int octetValue = Integer.parseInt(octet);
bitmask = (bitmask << 8) | octetValue;
}
String binaryString = Integer.toBinaryString(bitmask);
char firstChar = binaryString.charAt(0);
if (binaryString.chars().allMatch(c ->c == firstChar)) {
return false;
}
// 将位掩码取反后加1,然后检查是否为2的幂
bitmask = ~bitmask + 1;
return (bitmask & (bitmask - 1)) == 0;
}
}
1、首先判断是否是合法ip,以.进行分片后,应该为4部分,判断每部分都为数字,且不能小于0或者大于255
2、如果ip以0或127开头则直接跳过
3、判断是否是合法子网掩码,以.进行分片后,应该为4部分,将每个八位子网掩码转换为整数并添加到位掩码中,利用整数的位运算,先左移8位,再或运算。将位掩码按位取反加1,得到补码,补码与补码减1,如果为0,则是2的整数次幂,即掩码的二进制为连续的1接连续的0,注意:利用Integer.toBinaryString()将整形转换为二进制字符串,利用string.chars().allMatch(c->c==firstChar)判断,掩码是否全是0或1,返回false;
4、之后判断ip所属,利用int 数组累加,输出
SHEIN希音公司福利 350人发布