一、题目
https://leetcode.cn/problems/validate-ip-address/description/
二、算法思想
基本的字符串操作和一点正则表达式匹配ipv6,测试用例有点麻烦,改了好几次。
三、代码实现
class Solution {
public String validIPAddress(String queryIP) {
String[] parts = queryIP.split("\\."); //将字符串按点号.进行划分,点号.是特殊字符需要转义,使用反斜杠“\\”来表示一个点号,转为字符数组
String[] strs = queryIP.split(""); //将字符串按每个字符分为字符数组
int c1 = 0,c2 = 0;
for(String str:strs){
if(str.equals(".")) c1++;
if(str.equals(":")) c2++;
}
if(c1>3||c2>7) return "Neither"; //用于判断点号.和冒号:的个数
if(parts.length == 4){ //iPv4地址判断
for(int i = 0;i<parts.length;i++){
//对于数组中的每个字符串,判断其长度是否为0或大于3,或者长度大于1且以"0"开头,如果是,则返回Neither
if(parts[i].length()==0||parts[i].length()>3||parts[i].length()>1&&parts[i].charAt(0)=='0')
return "Neither";
}
for(String part:parts){
try{
int value = Integer.parseInt(part);
if(value<0|| value>255){
return "Neither";
}
}catch(NumberFormatException e){
return "Neither";
}
}
return "IPv4";
}else{ //iPv6地址判断
parts = queryIP.split(":");
if(parts.length==8){
for(String part:parts){
if(!part.matches("^[0-9a-fA-F]{1,4}$")){ //IPv6字符匹配
return "Neither";
}
}
return "IPv6";
}else{
return "Neither";
}
}
}
}
一些测试用例
"172.16.254.1"
"2001:0db8:85a3:0:0:8A2E:0370:7334"
"01.01.01.01"
"12..33.4"
"192.0.0.1"
"01.01.01.01"
"256.256.256.256"