题解 | #识别有效的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 in = new Scanner(System.in);
// 7种情况,A,B,C,D,E,错误IP/错误子网掩码,私有IP
int error[] = new int[7];
while (in.hasNextLine()) {
String ipStr = in.nextLine();
if (ipStr.equals("")) {
break;
}
// 以~分隔,分别判断2个IP的情况
String splitIps = ipStr.split("~")[0];
String splitMask = ipStr.split("~")[1];
// 判断是否出现0或者127打头的
if (splitIps.startsWith("0") || splitIps.startsWith("127")) {
continue;
}
// 判断IP是否合法,以.分割,如果个数不为4,或者中间有空都是不合法的
if (!isIpLegal(splitIps) || !isMaskLegal(splitMask)) {
error[5]++;
continue;
}
// 判断为哪一类IP
String[] ips = splitIps.split("\\.");
Integer firstNum = Integer.parseInt(ips[0]);
// A类
if (firstNum >= 1 && firstNum <= 126) {
error[0]++;
// 在A类中,从10.0.0.0到10.255.255.255为私有IP
if (firstNum == 10) {
error[6]++;
}
}
// B类
if (firstNum >= 128 && firstNum <= 191) {
error[1]++;
// 在B类中,从172.16.0.0到172.31.255.255为私有IP
Integer secondNum = Integer.parseInt(ips[1]);
if (firstNum == 172 && secondNum >= 16 && secondNum <= 31) {
error[6]++;
}
}
// C类
if (firstNum >= 192 && firstNum <= 223) {
error[2]++;
// C类中,从192.168.0.0到192.168.255.255为私有IP
Integer secondNum = Integer.parseInt(ips[1]);
if (firstNum == 192 && secondNum == 168) {
error[6]++;
}
}
// D类
if (firstNum >= 224 && firstNum <= 239) {
error[3]++;
}
// E类
if (firstNum >= 240 && firstNum <= 255) {
error[4]++;
}
}
output(error);
}
/**
* 输出最终的结果
*
* @param error 结果集
*/
private static void output(int[] error) {
StringBuilder sb = new StringBuilder();
for (int i : error) {
sb.append(i).append(" ");
}
sb.deleteCharAt(sb.length() - 1);
System.out.println(sb);
}
/**
* 判断IP是否合法
*
* @param splitIps 原始ID
* @return 结果, true/false
*/
private static boolean isIpLegal(String splitIps) {
String[] ips = splitIps.split("\\.");
if (ips.length != 4) {
return false;
}
for (String ip : ips) {
if (ip.equals("")) {
return false;
}
if (Integer.parseInt(ip) < 0 || Integer.parseInt(ip) > 255) {
return false;
}
}
return true;
}
/**
* 判断子网掩码是否合法
*
* @param splitMask 原始子网掩码
* @return
*/
private static boolean isMaskLegal(String splitMask) {
if (!isIpLegal(splitMask)) {
return false;
}
String[] masks = splitMask.split("\\.");
// 每一段数量转成二进制字符串,再进行判断是否合法
String bitStr = toBinaryStr(masks[0]) + toBinaryStr(masks[1]) + toBinaryStr(masks[2]) + toBinaryStr(masks[3]);
if (!bitStr.matches("1+0+")) {
return false;
}
return true;
}
private static String toBinaryStr(String numStr) {
String bitStr = Integer.toBinaryString(Integer.parseInt(numStr));
while (bitStr.length() < 8) {
bitStr = "0" + bitStr;
}
return bitStr;
}
}
查看4道真题和解析