给定一个字符串 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
中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
和 "2001:db8:85a3:0:0:8A2E:0370:7334"
是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334"
和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334"
是无效的 IPv6 地址。
示例 1:
输入:queryIP = "172.16.254.1" 输出:"IPv4" 解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出:"IPv6" 解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:queryIP = "256.256.256.256" 输出:"Neither" 解释:既不是 IPv4 地址,又不是 IPv6 地址
提示:
queryIP
仅由英文字母,数字,字符'.'
和':'
组成。
Related Topics
- 字符串
👍 200👎 0
拆解方法 & Java的split的坑
先说坑
示例"1,2,".split(",").length
这个分出来结果是[1,2]
,长度不是3,末尾的 ,
会被省略
然后本题思路
- 字符串长度小于7个的直接
NEITHER
- 接下来只要预判前5个字符,根据是否出现
.
或者:
来区分用IPv4还是IPv6的方法去校验 - 分别根据IPv4还是IPv6的区别使用
.
或者:
来拆分,这里会遇到split
方法的坑 - 再接下来校验拆分后每一段的规则
- IPv4的长度为0-3个字符,每个字符只能是数字,不能有先导
0
,最终数字要小于256 - IPv6的长度为0-4个字符,每个字符只能是
0-9
或者A-F
或者A-F
每个方法各自封装处理
代码
class Solution {
String IPV4 = "IPv4";
String IPV6 = "IPv6";
String NEITHER = "Neither";
public String validIPAddress(String queryIP) {
if (queryIP.length() < 7){
return NEITHER;
}
for (int i = 0; i < 6; i++) {
if (queryIP.charAt(i) == '.'){
return isIpv4(queryIP);
}
if (queryIP.charAt(i) == ':'){
return isIpv6(queryIP);
}
}
return NEITHER;
}
/**
* 验证IPv4类型的IP字符串
* @param queryIP
* @return
*/
public String isIpv4(String queryIP){
String[] ipv4Nums = queryIP.split("\\.");
if (ipv4Nums.length != 4 || queryIP.charAt(queryIP.length()-1) == '.'){
return NEITHER;
}
for (String ipv4Num : ipv4Nums) {
if (!isIpv4Num(ipv4Num)){
return NEITHER;
}
}
return IPV4;
}
/**
* 验证IPv4的每一段
* @param ipv4NumStr
* @return
*/
public boolean isIpv4Num(String ipv4NumStr){
//单个长度大于3个 或者为空
if (ipv4NumStr.length()>3 || ipv4NumStr.length()==0){
return false;
}
//长度大于1的首个字符不能为0
if (ipv4NumStr.length()>1 && ipv4NumStr.charAt(0) == '0'){
return false;
}
int num = 0;
for (int i = 0; i < ipv4NumStr.length(); i++) {
int tmp = ipv4NumStr.charAt(i) - '0';
if (tmp < 0 || tmp > 9){
return false;
}
num *= 10;
num += tmp;
}
return num < 256;
}
/**
* 验证IPv6的字符串
* @param queryIP
* @return
*/
public String isIpv6(String queryIP){
String[] ipv6Nums = queryIP.split("\\:");
if (ipv6Nums.length != 8 || queryIP.charAt(queryIP.length()-1) == ':'){
return NEITHER;
}
for (String ipv6Num : ipv6Nums) {
if (!isIpv6Num(ipv6Num)){
return NEITHER;
}
}
return IPV6;
}
/**
* 验证IPv6的每一段
* @param ipv6NumStr
* @return
*/
public boolean isIpv6Num(String ipv6NumStr){
if (ipv6NumStr.length() > 4 || ipv6NumStr.length() < 1){
return false;
}
for (int i = 0; i < ipv6NumStr.length(); i++) {
char c = ipv6NumStr.charAt(i);
if (!(c - '0' >=0 && c - '9' <= 0)&&
!(c - 'A' >=0 && c - 'F' <= 0)&&
!(c - 'a' >=0 && c - 'f' <= 0)){
return false;
}
}
return true ;
}
}
发表评论