题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static java.util.Arrays.*;
import static java.util.stream.Stream.*;
public class Main {
public static void main(String[] args) throws IOException {
testTh();
}
private static void testTh() throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = bf.readLine()) != null) {
String ip_1 = bf.readLine();
String ip_2 = bf.readLine();
if (!isLegalNetmask(str) || !isLegalIp(ip_1) || !isLegalIp(ip_2)) {
System.out.println(1);
} else {
ArrayList<String> netmask = ip2BinArrayList(str);
ArrayList<String> ip1 = ip2BinArrayList(ip_1);
ArrayList<String> ip2 = ip2BinArrayList(ip_2);
if (isEqualIpAndNetmask(ip1, ip2, netmask)) {
System.out.println(0);
} else {
System.out.println(2);
}
}
}
}
public static ArrayList<String> ip2BinArrayList(String ip) {
ArrayList<String> res = new ArrayList<>();
String[] netmask = ip.split("\\.");
for (int i = 0; i < 4; i++) {
String temp = Integer.toBinaryString(Integer.parseInt(netmask[i]));
if (temp.length() != 8) {
int length = temp.length();
for (int j = 0; j < 8 - length; j++) {
temp = "0" + temp;
}
}
res.add(temp);
}
return res;
}
public static Boolean isEqualIpAndNetmask(ArrayList<String> ip1,
ArrayList<String> ip2, ArrayList<String> netmask) {
return consultIpAndNetmask(ip1, netmask).equals(consultIpAndNetmask(ip2,
netmask));
}
public static String consultIpAndNetmask(ArrayList<String> ip,
ArrayList<String> netmask) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
String tempIp = ip.get(i);
String tempNetmask = netmask.get(i);
for (int j = 0; j < 8; j++) {
int r = Integer.parseInt(tempIp.charAt(j) + "") + Integer.parseInt(
tempNetmask.charAt(j) + "");
if (r == 1 || r == 0) {
sb.append("0");
} else {
sb.append("1");
}
}
sb.append(".");
}
return sb.toString();
}
public static Boolean isLegalNetmask(String netmask) {
String[] split = netmask.split("\\.");
if (split.length != 4) {
return false;
}
if (Integer.parseInt(split[0]) == 0)return false;
for (int i = 0; i < 4; i++) {
int parseInt = Integer.parseInt(split[i]);
if (parseInt<0||parseInt>255)return false;
if (parseInt != 255 && parseInt != 0) {
String binaryString = Integer.toBinaryString(parseInt);
int lastIndexOf = binaryString.lastIndexOf("1");
int indexOf = binaryString.indexOf("0");
if (indexOf - lastIndexOf != 1) {
return false;
}
}
if (parseInt == 255 && i != 0) {
int j = i - 1;
if (Integer.parseInt(split[j]) != 255) {
return false;
}
}
if (parseInt == 0 && i != 3) {
int j = i + 1;
if (Integer.parseInt(split[j]) != 0) {
return false;
}
}
}
return true;
}
public static Boolean isLegalIp(String ip) {
String[] split = ip.split("\\.");
for (int i = 0; i < 4; i++) {
int parseInt = Integer.parseInt(split[i]);
if (parseInt < 0 || parseInt > 255) {
return false;
}
}
return true;
}
}
查看7道真题和解析