验证IP地址
个人记录总结用,有更好的方法欢迎提出
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-ip-address
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (:😃 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。
示例 1:
输入: "172.16.254.1"
输出: "IPv4"
解释: 这是一个有效的 IPv4 地址, 所以返回 "IPv4"。
示例 2:
输入: "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出: "IPv6" 解释: 这是一个有效的 IPv6 地址, 所以返回 "IPv6"。
示例 3:
输入: "256.256.256.256"
输出: "Neither"
解释: 这个地址既不是 IPv4 也不是 IPv6 地址。
示例 3:
输入: "256.256.256.256"
输出: "Neither"
解释: 这个地址既不是 IPv4 也不是 IPv6 地址。
我的解答:

/*
0 : 48
9 : 57
a : 97
e : 101
A : 65
E : 69
*/
public class Solution5 {
@Test
public void test() {
System.out.println(validIPAddress("172.16.254.1"));
}
public String validIPAddress(String IP) {
if (IP.trim().equals(""))
return "Neither";
if (IP.contains("."))
return checkV4(IP);
else
return checkV6(IP);
}
public String checkV4(String IP) {
if (IP.contains(".."))
return "Neither";
if (IP.charAt(0) == '.' || IP.charAt(IP.length() - 1) == '.')
return "Neither";
int j = 0, k = 0;
for (int i = 0; i < IP.length(); i++) {
if (IP.charAt(i) == '.') {
if (j < 0 || j > 255)
return "Neither";
j = 0;
k++;
continue;
}
if (IP.charAt(i) < 48 || IP.charAt(i) > 57)
return "Neither";
j = j * 10 + (IP.charAt(i) - '0');
if (j == 0 && IP.charAt(i + 1) != '.')
return "Neither";
}
if (k != 3 || j < 0 || j > 255)
return "Neither";
return "IPv4";
}
public String checkV6(String IP) {
if (IP.contains("::"))
return "Neither";
if (IP.charAt(0) == ':' || IP.charAt(IP.length() - 1) == ':')
return "Neither";
int j = 0, k = 0;
for (int i = 0; i < IP.length(); i++) {
if (IP.charAt(i) == ':') {
j = 0;
k++;
continue;
}
if (IP.charAt(i) < 48 || IP.charAt(i) > 57 && IP.charAt(i) < 65 || IP.charAt(i) > 70 && IP.charAt(i) < 97 || IP.charAt(i) > 102)
return "Neither";
j++;
if (j > 4)
return "Neither";
}
if (k != 7)
return "Neither";
return "IPv6";
}
}
题解:用时和内存消耗和我一样
class Solution {
public String validIPAddress(String IP) {
if (IP.startsWith(":") || IP.startsWith(".") || IP.endsWith(":") || IP.endsWith(".")) return "Neither";
String[] splitted = IP.split("\\.");
if (splitted.length == 4) {
int num = -1;
for (int i = 0; i < 4; i++) {
try {
num = Integer.parseInt(splitted[i]);
} catch (NumberFormatException e) {
return "Neither";
}
if (num < 0 || num > 255) return "Neither";
if (splitted[i].length() > 1 && (splitted[i].startsWith("0") || splitted[i].startsWith("-")))
return "Neither";
}
return "IPv4";
} else {
splitted = IP.split(":");
if (splitted.length == 8) {
long num = -1;
for (int i = 0; i < 8; i++) {
if (splitted[i].length() > 4 || splitted[i].startsWith("-")) return "Neither";
try {
num = Long.parseLong(splitted[i], 16);
} catch (NumberFormatException e) {
return "Neither";
}
if (num < 0) return "Neither";
}
return "IPv6";
} else return "Neither";
}
}
}
作者:zeromax
链接:https://leetcode-cn.com/problems/two-sum/solution/shi-yong-splithe-parseint-shuang-can-shu-parselong/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结:题目没什么难度,但还是失败多次是因为各种边界考虑不全
浙公网安备 33010602011771号