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

image
示例1

输入:
10.70.44.68~1.1.1.5
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0
输出:1 0 1 0 0 2 1
说明:在这个样例中:
第一条地址信息:掩码非法;
第二条地址信息:IP 格式和掩码均合法,属于 A 类;
第三条地址信息:IP 格式和掩码均合法,属于 C 类私有地址;
第四条地址信息:IP 格式非法。
统计得到 
1 个 A 类,
0 个 B 类,
1 个 C 类,
0 个 D 类,
0 个 E 类,
2 个错误条目,
1 个私有地址。

示例2

输入:
0.201.56.50~255.255.255.0
127.201.56.50~255.255.111.255
输出:
0 0 0 0 0 0 0
说明:
在这个样例中,两条地址信息均属于上方提示中提到的特殊 IP 地址,不需要处理,直接跳过。特别需要注意地,第二条地址的子网掩码是非法的。但是因为该条为特殊 IP 地址,此优先级更高,所以不进入统计。

答案如下:

package everydayPractice.bitOperation.HJ_18;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Scanner;

/**
 * Created by xxx on 2026/6/30
 */
public class AnswerMA {
	public static void main(String[] args) throws UnknownHostException {
		//A类地址的起始范围
		long A_starter = 16777216L;//"1.0.0.0"
		long A_end = 2147483647L;//"127.255.255.255"
		//B类地址的起始范围
		long B_starter = 2147483648L;//"128.0.0.0"
		long B_end = 3221225471L;//"191.255.255.255"
		//C类地址的起始范围
		long C_starter = 3221225472L;//"192.0.0.0"
		long C_end = 3758096383L;//"223.255.255.255"
		//D类地址的起始范围
		long D_starter = 3758096384L;//"224.0.0.0"
		long D_end = 4026531839L;//"239.255.255.255"
		//E类地址的起始范围
		long E_starter = 4026531840L;//"240.0.0.0"
		long E_end = 4294967295L;//"255.255.255.255"

		//3种私有地址
		long siyou1Starter = ipv4ToLong("10.0.0.0");
		long siyou1End = ipv4ToLong("10.255.255.255");
		long siyou2Starter = ipv4ToLong("172.16.0.0");
		long siyou2End = ipv4ToLong("172.31.255.255");
		long siyou3Starter = ipv4ToLong("192.168.0.0");
		long siyou3End = ipv4ToLong("192.168.255.255");

		//全部有效的掩码
		HashSet<String> allMask = new HashSet<String>();
		allMask.add("255.255.255.254");
		allMask.add("255.255.255.252");
		allMask.add("255.255.255.248");
		allMask.add("255.255.255.240");
		allMask.add("255.255.255.224");
		allMask.add("255.255.255.192");
		allMask.add("255.255.255.128");
		allMask.add("255.255.255.0");
		allMask.add("255.255.254.0");
		allMask.add("255.255.252.0");
		allMask.add("255.255.248.0");
		allMask.add("255.255.240.0");
		allMask.add("255.255.224.0");
		allMask.add("255.255.192.0");
		allMask.add("255.255.128.0");
		allMask.add("255.255.0.0");
		allMask.add("255.254.0.0");
		allMask.add("255.252.0.0");
		allMask.add("255.248.0.0");
		allMask.add("255.240.0.0");
		allMask.add("255.224.0.0");
		allMask.add("255.192.0.0");
		allMask.add("255.128.0.0");
		allMask.add("255.0.0.0");
		allMask.add("254.0.0.0");
		allMask.add("252.0.0.0");
		allMask.add("248.0.0.0");
		allMask.add("240.0.0.0");
		allMask.add("224.0.0.0");
		allMask.add("192.0.0.0");
		allMask.add("128.0.0.0");


		int ACount = 0;
		int BCount = 0;
		int CCount = 0;
		int DCount = 0;
		int ECount = 0;
		int errCount = 0;
		int privateCount = 0;
		Scanner in = new Scanner(System.in);
		// 注意 hasNext 和 hasNextLine 的区别
		while (in.hasNextLine()) { // 注意 while 处理多个 case
			String strLine = in.nextLine();
			String[] ipAndMask = strLine.split("~");
			String ip = ipAndMask[0];//ipv4
			String mask = ipAndMask[1];//掩码
			String[] ipArr = ip.split("\\.");
			if (ipArr.length < 4) {
				errCount += 1;//ipv4不合法的情况一
				continue;
			}
			boolean flag = false;
			for (String s : ipArr) {
				if ("".equals(s)) {
					errCount += 1;//ipv4不合法的情况二
					flag = true;
					break;
				}
			}
			if (flag) {
				continue;
			}
			if (!allMask.contains(mask)) {
				errCount += 1;//掩码不合法的情况
				continue;
			}

			//属于私有地址
			long ipToLong = ipv4ToLong(ip);
			if ((siyou1Starter <= ipToLong && ipToLong <= siyou1End) || (siyou2Starter <= ipToLong && ipToLong <= siyou2End) || (siyou3Starter <= ipToLong && ipToLong <= siyou3End)) {
				privateCount += 1;
			}

			//属于A类地址
			if (A_starter <= ipToLong && ipToLong <= A_end) {
				ACount += 1;
				continue;
			}
			//属于B类地址
			if (B_starter <= ipToLong && ipToLong <= B_end) {
				BCount += 1;
				continue;
			}
			//属于C类地址
			if (C_starter <= ipToLong && ipToLong <= C_end) {
				CCount += 1;
				continue;
			}
			//属于D类地址
			if (D_starter <= ipToLong && ipToLong <= D_end) {
				DCount += 1;
				continue;
			}
			//属于E类地址
			if (E_starter <= ipToLong && ipToLong <= E_end) {
				ECount += 1;
				continue;
			}
		}
		System.out.print(ACount + " ");
		System.out.print(BCount + " ");
		System.out.print(CCount + " ");
		System.out.print(DCount + " ");
		System.out.print(ECount + " ");
		System.out.print(errCount + " ");
		System.out.print(privateCount);
	}

	//ipv4转成long型数据
	public static long ipv4ToLong(String ipAddress) throws UnknownHostException {
		InetAddress inetAddress = InetAddress.getByName(ipAddress);
		byte[] addressBytes = inetAddress.getAddress();
		long result = 0;
		for (byte octet : addressBytes) {
			result <<= 8;
			result |= octet & 0xff;
		}
		return result;
	}
}

牛客网的第6个测试用例是错误的,第6个测试用例如下:

225.240.129.203~255.110.255.255     √

183.181.49.4~255.0.0.0                    

172.177.113.45~255.0.0.0

176.134.46.246~255.0.0.0

153.63.21.56~255.255.58.255         √

23.135.167.228~255.0.0.0

204.58.47.149~255.0.0.0

113.33.181.46~255.255.255.0

73.245.52.119~255.255.154.0         √

23.214.47.71~255.0.0.0

139.124.188.91~255.255.255.100      √

142.94.192.197~255.0.0.0

53.173.252.202~255.0.0.0

127.201.56.50~255.255.111.255       √

118.251.84.111~255.0.0.0

130.27.73.170~255.0.0.0

253.237.54.56~255.86.0.0            √

64.189.222.111~255.255.255.139      √

148.77.44.147~255.0.0.0

59.213.5.253~255.255.0.0

3.52.119.131~255.255.0.0

213.208.164.145~255.255.0.0

24.22.21.206~255.255.90.255         √

89.43.34.31~255.0.0.0

9.64.214.75~255.0.0.0

110.156.20.173~255.153.0.0          √

71.183.242.53~255.255.0.0

119.152.129.100~255.0.0.0

38.187.119.201~255.0.0.0

73.81.221.180~255.255.255.255       √

73.198.13.199~255.0.15.0            √

99.42.142.145~255.255.255.0 

196.121.115.160~255.0.0.0

226.30.29.206~255.0.0.0

244.248.31.171~255.255.255.255      √

59.116.159.246~255.0.0.0

121.124.37.157~255.0.0.226          √

103.42.94.71~255.255.0.0

125.88.217.249~255.255.74.255       √

73.44.250.101~255.255.255.0


我后面有标记的都是掩码不合格的,结果测试用例的第6列只统计出来13个【错误 IP 或错误子网掩码数】
image
真是搞笑,看一下官方答案,还要买会员,要不是面试要考这个上面的题,我压根都不会来这里刷,好好学学人家leetcode吧,牛客网。

posted @ 2026-06-30 18:50  Carey_ccl  阅读(17)  评论(0)    收藏  举报