题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//分别代表A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数
int[] count = new int[7];
while(in.hasNextLine()){
String str = in.nextLine();
String[] addr = str.split("~");
//先判断地址是否合法
Info info = new Info(-1, 0);
boolean ipflag = ipjudge(addr[0], info);
boolean maskflag = maskjudge(addr[1]);
//若合法,则判断属于哪一类
if(info.type == 6){
continue;
}
if(ipflag && maskflag){
count[info.type]++;
if(info.num != 0){
count[6]++;
}
}else{
count[5]++;
}
}
for(int i = 0; i < 7; i++){
System.out.print(count[i]);
if(i != 6){
System.out.print(" ");
}
}
}
public static boolean ipjudge(String str, Info info){
String[] ip = str.split("\\.");
if(ip.length < 4){
return false;
}
int[] nums = new int[4];
for(int i = 0; i < ip.length; i++){
int sum = 0;
for(int j = 0; j < ip[i].length(); j++){
char ch = ip[i].charAt(j);
if(ch>= '0' && ch <= '9'){
sum = sum * 10 + (int)(ch - '0');
}else{ //遇到其它字符,直接返回false
return false;
}
}
if(sum > 255){
return false;
}else{
nums[i] = sum;
}
}
//判断ip地址的类型
if(nums[0] >= 1 && nums[0] <= 126){
info.type = 0;
}else if(nums[0] >= 128 && nums[0] <= 191){
info.type = 1;
}else if(nums[0] >= 192 && nums[0] <= 223){
info.type = 2;
}else if(nums[0] >= 224 && nums[0] <= 239){
info.type = 3;
}else if(nums[0] >= 240 && nums[0] <= 255){
info.type = 4;
}
//判断是否为私网ip
if( (nums[0] == 10)
|| (nums[0] == 172 && nums[1] >= 16 && nums[1] <= 31)
|| (nums[0] == 192 && nums[1] == 168)){
info.num = 1;
}
if(nums[0] == 0 || nums[0] == 127){
info.type = 6;
}
return true;
}
public static boolean maskjudge(String str){
String[] mask = str.split("\\.");
StringBuffer sb = new StringBuffer();
//十进制转二进制
for(int i = 0; i < mask.length; i++){
int sum = 0;
for(int j = 0; j < mask[i].length(); j++){
char ch = mask[i].charAt(j);
if(ch>= '0' && ch <= '9'){
sum = sum * 10 + (int)(ch - '0');
}else{ //遇到其它字符,直接返回false
return false;
}
}
if(sum < 0 || sum > 255){
return false;
}
String number = Integer.toBinaryString(sum);
for(int j = 0; j < 8 - number.length(); j++){
sb.append('0');
}
sb.append(number);
}
String mask2 = sb.toString();
int loc1 = -1;
int loc0 = mask2.length();
for(int i = 0; i < mask2.length(); i++){
if(mask2.charAt(i) == '0'){
loc0 = i;
}else{
loc1 = i;
}
if(loc0 < loc1){ //如果出现了0在1之前,则说明子网掩码不合法
return false;
}
}
if(loc1 == -1 || loc0 == mask2.length()){
return false;
}
return true;
}
}
class Info{
int type;
int num;
public Info(Integer type, Integer num) {
this.type = type;
this.num = num;
}
}