题解 | #字符串最后一个单词的长度#,一步一步来其实是比中等题容易的,刚开始还以为子网掩码只有0和255
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String subnetMask = in.nextLine();
String ip1 = in.nextLine();
String ip2 = in.nextLine();
// 判断是否合法
char c = isError(subnetMask, ip1, ip2);
switch (c){
case '1':
System.out.println("1");
break;
case '2':
System.out.println("2");
break;
case '0':
System.out.println("0");
}
}
}
public static char isError(String subnetMask, String ip1, String ip2) {
String[] split1 = subnetMask.split("\\.");
String[] split2 = ip1.split("\\.");
String[] split3 = ip2.split("\\.");
int length1 = split1.length;
int length2 = split2.length;
int length3 = split3.length;
if (length1 != 4 || length2 != 4 || length3 != 4) {
return '1';
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length1; i++) {
String s = split1[i];
// 确保都是数字组成
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) < '0' || s.charAt(j) > '9'){
return '1';
}
}
// 判断范围
int parseInt = Integer.parseInt(s);
if (parseInt < 0 ||parseInt > 255){
return '1';
}
String binaryString = Integer.toBinaryString(parseInt);
int length = binaryString.length();
if (length < 4){
for (int j = 0; j < 4 - length; j++) {
builder.append("0");
}
}
builder.append(binaryString);
}
// 是否都包含0和1
boolean b1 = builder.toString().contains("0");
boolean b2 = builder.toString().contains("1");
if (!b1 || !b2) {
return '1';
}
// 最后一次出现1的索引比第一次出现0的索引大
if (builder.lastIndexOf("1") > builder.indexOf("0")) {
return '1';
}
boolean isErrorIp1 = isErrorIp(split2);
boolean isErrorIp2 = isErrorIp(split3);
if (isErrorIp1 || isErrorIp2) {
return '1';
}
boolean b = isEqual(split1, split2, split3);
if (!b) {
return '2';
}
return '0';
}
private static boolean isEqual(String[] split1, String[] split2, String[] split3) {
StringBuffer buffer1 = new StringBuffer();
StringBuffer buffer2 = new StringBuffer();
StringBuffer buffer3 = new StringBuffer();
for (int i = 0; i < 4; i++) {
String s1 = split1[i];
String s2 = split2[i];
String s3 = split3[i];
int parseInt1 = Integer.parseInt(s1);
int parseInt2 = Integer.parseInt(s2);
int parseInt3 = Integer.parseInt(s3);
String binaryString1 = Integer.toBinaryString(parseInt1);
int length1 = binaryString1.length();
if (length1 < 8){
for (int j = 0; j < 8 - length1; j++) {
buffer1.append("0");
}
}
String binaryString2 = Integer.toBinaryString(parseInt2);
int length2 = binaryString2.length();
if (length2 < 8){
for (int j = 0; j < 8 - length2; j++) {
buffer2.append("0");
}
}
String binaryString3 = Integer.toBinaryString(parseInt3);
int length3 = binaryString3.length();
if (length3 < 8){
for (int j = 0; j < 8 - length3; j++) {
buffer3.append("0");
}
}
buffer1.append(binaryString1);
buffer2.append(binaryString2);
buffer3.append(binaryString3);
}
char[] chars1 = buffer1.toString().toCharArray();
char[] chars2 = buffer2.toString().toCharArray();
char[] chars3 = buffer3.toString().toCharArray();
StringBuilder result1 = new StringBuilder();
StringBuilder result2 = new StringBuilder();
for (int i = 0; i < 32; i++) {
if (chars1[i] == '1' && chars2[i] == '1'){
result1.append("1");
}else {
result1.append("0");
}
if (chars1[i] == '1' && chars3[i] == '1'){
result2.append("1");
continue;
}
result2.append("0");
}
if (!result1.toString().equals(result2.toString())){
return false;
}
return true;
}
public static boolean isErrorIp(String[] str) {
for (int i = 0; i < str.length; i++) {
String s = str[i];
char[] chars = s.toCharArray();
for (int j = 0; j < chars.length; j++) {
if (chars[j] < '0' || chars[j] > '9') {
return true;
}
}
int parseInt = Integer.parseInt(s);
if (parseInt < 0 || parseInt > 255) {
return true;
}
}
return false;
}
}