通过万岁!!!
- 题目:就是给你一个字符串,按照一定规则,判断字符串是不是IP地址,如果是IPv4的就输出IPv4,如果是IPv6的就输出IPv6,否则输出Neither。
- IPv4:4组0-255之间的数,中间用“.”进行分割。每组数不允许以0开头,但是可以单独写0。
- IPv6:8组,每组长度为0-4,每个字符是16进制的。可以存在0开头。
- 思路:首先就是判断是什么类型的。长度如果小于15的话,就是ipv4的,如果大于15的话,就是ipv6,如果等于15的话,我们需要再次判断。这时候直接判断第二个字符是不是“:”,如果是就是16进制的,否则就是二进制。因为长度为15,只有可能是4*3+3和8+7,也就是ipv4满和ipv6每组都是个位数。
- 技巧:这里就是字符串的拆分和遍历,不过需要注意,用“.”进行拆分的时候,需要split(“\.”),还有就是java拆分字符串,最后一个字符要是满足条件,不会给你补充一个空字符放在最后。
java代码
class Solution {
public String validIPAddress(String queryIP) {
int len = queryIP.length();
if (len == 0) return "Neither";
if (len > 15 || (len == 15 && queryIP.charAt(1) == ':')) {
if (queryIP.charAt(len - 1) == ':') return "Neither";
String[] split = queryIP.split(":");
if (split.length != 8) return "Neither";
for (int i = 0; i < 8; i++) {
if (!six(split[i])) {
return "Neither";
}
}
return "IPv6";
} else {
if (queryIP.charAt(len - 1) == '.') return "Neither";
String[] split = queryIP.split("\\.");
if (split.length != 4) return "Neither";
for (int i = 0; i < 4; i++) {
if (!four(split[i])) {
return "Neither";
}
}
return "IPv4";
}
}
public boolean six(String s) {
int len = s.length();
if (len > 4 || len == 0) return false;
for (int i = 0; i < len; i++) {
if (!((s.charAt(i) >= 'a' && s.charAt(i) <= 'f') ||
(s.charAt(i) >= 'A' && s.charAt(i) <= 'F') ||
(s.charAt(i) >= '0' && s.charAt(i) <= '9'))) {
return false;
}
}
return true;
}
public boolean four(String s) {
int len = s.length();
if (len > 3 || len == 0) return false;
if (s.charAt(0) == '0') {
if (len == 1) {
return true;
} else {
return false;
}
} else {
for (int i = 0; i < len; i++) {
if (!Character.isDigit(s.charAt(i))) {
return false;
}
}
int i = Integer.parseInt(s);
if (i >= 0 && i <= 255) {
return true;
} else {
return false;
}
}
}
}
- 总结:题目不难,就是比较麻烦,并且需要注意,我们需要单独判断queryIP.charAt(len - 1) = ‘:’ 或者是=‘.’,这是因为这时候我们通过数组的长度判断不出来,也就是如果最后一个字符是要拆分的字符,则数组最后不会补一个空字符串。还有就是主要“.”这个符号的比较。