持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
前言
今天的题目是中等题,验证ip地址,这题目不难,主要难在边界判断上面,边界判断条件很多,每一个例子都要补一下边界条件。时不时就会漏一个。
题目
468. 验证IP地址 【难度中等】 边界边界还是边界。
给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中: 1 <= xi.length <= 4 xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。 在 xi 中允许前导零。
解题思路
由题可知题目已经把所有的边界条件都列出来了,我们只需要根据他的边界条件走即可,我的思路是先判断地址是ipv4 还是ipv6,这个从他们的长度就能获取到了,然后根据ipv4和ipv6的特性去一一化解,ipv4基本是纯数字并且不能为有特殊符号等,而ipv6则是字母加数字,十六进制字母的限制。我们根据他的边界条件写出如下代码直接提交通过。
解题代码
class Solution {
public String validIPAddress(String queryIP) {
String[] ipv4s = queryIP.split("\\.");
String[] ipv6s = queryIP.split(":");
if (ipv4s.length == 4) {
char[] ipChar = queryIP.toCharArray();
for (int i = 0; i < ipChar.length; i++) {
if (i == ipChar.length - 1){
if (ipChar[i] == 46) {
return "Neither";
}
}
}
for (int i = 0; i < ipv4s.length; i++) {
String numStr = ipv4s[i];
if (numStr.equals("")){
return "Neither";
}
char[] chars = numStr.toCharArray();
for (int j = 0; j < chars.length; j++) {
if (!(chars[j] >= 48 && chars[j]<= 57)){
return "Neither";
}
if (chars.length == 1){
continue;
}
if ((chars[j] == 48 && j == 0)){
return "Neither";
}
}
int num = 0;
try {
num = Integer.parseInt(numStr);
}catch (Exception e){
return "Neither";
}
if (!(num >= 0 && num <= 255)) {
return "Neither";
}
}
return "IPv4";
}else if(ipv6s.length == 8){
char[] ipChar = queryIP.toCharArray();
for (int i = 0; i < ipChar.length; i++) {
if (!((ipChar[i] >= 97 && ipChar[i] <= 102) || (ipChar[i] >= 65 && ipChar[i]<= 70) || (ipChar[i] >= 48 && ipChar[i]<= 57) || ipChar[i] == 58)){
return "Neither";
}
if (i == ipChar.length - 1){
if (ipChar[i] == 58) {
return "Neither";
}
}
}
// a-z 97 -102 A-Z 65-70 0-9 48-57
for (String ipv6 : ipv6s) {
if (ipv6.equals("")) {
return "Neither";
}
}
for (int i = 0; i < ipv6s.length; i++) {
char[] chars = ipv6s[i].toCharArray();
if (chars.length > 4){
return "Neither";
}
}
return "IPv6";
}
return "Neither";
}
}