题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner;
/**
* HJ18 识别有效的IP地址和掩码并进行分类统计
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int aNum = 0;
int bNum = 0;
int cNum = 0;
int dNum = 0;
int eNum = 0;
int errNum = 0;
int privNum = 0;
while (scanner.hasNextLine()) {
String str = scanner.nextLine();
if (str.equals("")) {
break;
}
String[] input = str.split("~");
int ipFirst = getIpSeg(input[0], 0);
// 0和127开头的过滤掉不计数
if (ipFirst == 0 || ipFirst == 127) {
continue;
}
// 非法IP和非法掩码计数
if (!isValidIp(input[0])) {
errNum++;
continue;
}
if (!isValidMask(input[1])) {
errNum++;
continue;
}
// ABCDE计数
if (ipFirst >= 1 && ipFirst <= 126) {
aNum++;
}
if (ipFirst >= 128 && ipFirst <= 191) {
bNum++;
}
if (ipFirst >= 192 && ipFirst <= 223) {
cNum++;
}
if (ipFirst >= 224 && ipFirst <= 239) {
dNum++;
}
if (ipFirst >= 240 && ipFirst <= 255) {
eNum++;
}
//私有IP计数
int ipSecond = getIpSeg(input[0], 1);
if (ipFirst == 10 || (ipFirst == 172 && ipSecond >= 16 && ipSecond <= 32) ||
(ipFirst == 192 && ipSecond == 168)) {
privNum++;
}
}
System.out.println(aNum + " " + bNum + " " + cNum + " " + dNum + " " + eNum +
" " + errNum + " " + privNum);
}
static int getIpSeg(String ip, int index) {
String[] arr = ip.split("\\.");
return Integer.parseInt(arr[index]);
}
static boolean isValidIp(String ip) {
String[] ipi = ip.split("\\.");
if (ipi.length != 4) {
return false;
}
for (String ss : ipi) {
if (Integer.parseInt(ss) < 0 || Integer.parseInt(ss) > 255) {
return false;
}
}
return true;
}
static boolean isValidMask(String mask) {
if (!isValidIp(mask)) {
return false;
}
StringBuilder stringBuilder = new StringBuilder();
String[] maski = mask.split("\\.");
for (String ss : maski) {
String binary = Integer.toBinaryString(Integer.parseInt(ss));
binary = String.format("%08d", Integer.parseInt(binary));
stringBuilder.append(binary);
}
// 主机号为0(00000000)且在网络号(11111111)后
return stringBuilder.toString().lastIndexOf("1") <
stringBuilder.toString().indexOf("0");
}
}

小天才公司福利 1316人发布