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

示例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 或错误子网掩码数】

真是搞笑,看一下官方答案,还要买会员,要不是面试要考这个上面的题,我压根都不会来这里刷,好好学学人家leetcode吧,牛客网。

浙公网安备 33010602011771号