题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

编码 30min,调试 1 小时,全是判断子网掩码的代码出 bug,调了快一个点,我是不是太菜了,要写这么久。感觉判断子网掩码的代码自己写的很傻杯。

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
	private static final int A = 1;
	private static final int B = 2;
	private static final int C = 4;
	private static final int D = 8;
	private static final int E = 16;
	private static final int ERR = 32;
	private static final int PRI = 64;
	private static final int IGNORE = 128;
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		int a = 0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0;
		while (in.hasNextLine()) {
			String[] arr = in.nextLine().split("~");
			String ip = arr[0];
			String mask = arr[1];

			int ipc = validIP(ip);
			if (!validMASK(mask)) {
				if (ipc != IGNORE)
					err++;
				continue;
			}
			// valid ip ?
			switch (ipc) {
				case A:
					a++;
					break;
				case A | PRI:
					a++;
					pri++;
					break;
				case B:
					b++;
					break;
				case B | PRI:
					b++;
					pri++;
					break;
				case C:
					c++;
					break;
				case C | PRI:
					c++;
					pri++;
					break;
				case D:
					d++;
					break;
				case E:
					e++;
					break;
				case ERR:
					err++;
					break;
				case PRI:
					pri++;
					break;
				case IGNORE:
					break;
			}
			// valid mask ?
		}
		System.out.println(a + " " + b + " " + c + " " + d + " " + e + " " + err + " " + pri);
	}

	public static boolean validMASK(String mask) {
		List<Integer> valid = Arrays.asList(128, 192, 224, 240, 248, 252, 254, 255, 0);
		String[] arr = mask.split("\\.");
		int a = Integer.parseInt(arr[0]);
		int b = Integer.parseInt(arr[1]);
		int c = Integer.parseInt(arr[2]);
		int d = Integer.parseInt(arr[3]);

		if (!valid.contains(b)) {
			return false;
		} else {
			if (b == 255) {
				if (!valid.contains(c)) {
					return false;
				} else {
					if (c == 255) {
						if (!valid.contains(d)) return false;
						if (d == 255) return false;
					} else {
						if (d > 0) return false;
					}
				}
			} else {
				if (c > 0 || d > 0) return false; 
			}
		}

		return true;
	}

	public static int validIP(String ip) {
		Pattern pattern = Pattern.compile("(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})");
		Matcher matcher = pattern.matcher(ip);

		if (matcher.matches()) {
			int a = Integer.parseInt(matcher.group(1)); if (a == 0 || a == 127) return IGNORE;
			int b = Integer.parseInt(matcher.group(2));
			if (a >= 1 && a <= 126) {
				if (a == 10) return A | PRI;
				else return A;
			}
			if (a >= 128 && a <= 191) {
				if (a == 172 && b >= 16 && b <= 31) return B | PRI;
				else return B;
			}
			if (a >= 192 && a <= 223) {
				if (a == 192 && b == 168) return C | PRI;
				else return C;
			}
			if (a >= 224 && a <= 239) {
				return D;
			}
			if (a >= 240 && a <= 255) {
				return E;
			}
		}
		return ERR;
	}
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务