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 }