JAVA-朴素解法 又臭又长
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/questionTerminal/de538edd6f7e4bc3a5689723a7435682
主要就是合法性判断 和 ip计数 错误ip/mask 计数
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] cc=new int[7];
String in;
while ((in = br.readLine()) != null) {
String[] sin=in.split("~");
String ip=sin[0];String mask=sin[1];
boolean isIP=isIP(ip,cc);boolean isMask=isMask(mask);
if(isIP && isMask){
cc=countIP(ip,cc);
}else{
cc[5]++;
}
}//while end
for(int i=0;i<6;i++)
System.out.print(cc[i]+" ");
System.out.print(cc[6]);
}//method end
public static boolean isIP(String ip,int[] count){
//ip合法性判断,
//1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时可以忽略
//默认判定其为真即可,因为后续ip计数是避开了这两个字段的
//但是为了不影响 查找其对应子网掩码错误的时候 需要计数 我们这里 默认为真即可
String[] iparr=ip.split("\\.");
Boolean isTrue = true;
for (int i = 0; i < iparr.length; i++) {
if (iparr[i].length() <= 0 || iparr[i] == "") {//非法判断
isTrue = false;
}
}
return isTrue;
}//method end
public static boolean isMask(String mask){
//子网掩码合法性判断
String[] maskarr=mask.split("\\.");
boolean res=false;
int[] maskRange = {254, 252, 248, 240, 224, 192, 128, 0};
List<Integer> list=new ArrayList();
for(int i:maskRange)
list.add(i);
if ("255".equals(maskarr[0])&&"255".equals(maskarr[1])&&"255".equals(maskarr[2])) {
if (list.contains(Integer.parseInt(maskarr[3]))) {
res=true;
}
}else if("255".equals(maskarr[0])&&"255".equals(maskarr[1])){
if(list.contains(Integer.parseInt(maskarr[2]))&&"0".equals(maskarr[3])){
res=true;
}
}else if("255".equals(maskarr[0])){
if(list.contains(Integer.parseInt(maskarr[1]))&&"0".equals(maskarr[2])&&"0".equals(maskarr[3])){
res=true;
}
}else if(list.contains(Integer.parseInt(maskarr[0]))){
if("0".equals(maskarr[1])&&"0".equals(maskarr[2])&&"0".equals(maskarr[3])){
res=true;
}
}
return res;
}//method end
public static boolean isPrivateIP(String ip){
//私有IP判断
String[] sin=ip.split("\\.");
if(Integer.parseInt(sin[0])==10) return true;
else if(Integer.parseInt(sin[0])==172&&(Integer.parseInt(sin[1])>15&&Integer.parseInt(sin[1])<32)){
return true;
}else if(Integer.parseInt(sin[0])==192&&Integer.parseInt(sin[1])==168){
return true;
}else{
return false;
}
}//method end
public static int[] countIP(String ip,int[] count){
//各类ip计数
String[] sin=ip.split("\\.");
int first=Integer.parseInt(sin[0]);
int second=Integer.parseInt(sin[1]);
//私有ip
if(isPrivateIP(ip)) count[6]++;
//判断其他地址范围
if (first >= 1 && first <= 126)
count[0]++;
else if (first >= 128 && first <= 191)
count[1]++;
else if (first >= 192 && first <= 223)
count[2]++;
else if (first >= 224 && first <= 239)
count[3]++;
else if (first >= 240 && first <= 255)
count[4]++;
return count;
}//method end
}
