题解 | #验证IP地址#
验证IP地址
http://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
思路:排除一切不为Neither的情况,剩下的就是符合条件的情况。首先根据字符串是否含有"."和":"分为IPv4和IPv6两种情况,在分别进行甄别。需要注意的是IPv6的字符判定是否在合规区间的逻辑表达。
package main
import "strings"
import "strconv"
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
func solve( IP string ) string {
// write code here
if strings.Contains(IP, ".") {
//IP v4
IPSlice := strings.Split(IP, ".")
for _, s := range IPSlice {
//只要有一个为空就不符合
if s == "" {
return "Neither"
}
//只要有一个不是数字就不符合
for _, i := range s {
if i >= '9' || i <= '0' {
return "Neither"
}
}
//字符串转数字并判断是否大于255
num, _ := strconv.Atoi(s)
if num >= 256 {
return "Neither"
}
}
return "IPv4"
} else {
//IP v6
IPSlice := strings.Split(IP, ":")
for _, s := range IPSlice {
//只要有一个为空就不符合
if s == "" {
return "Neither"
}
for k, i := range s {
//每个“位”里第一个是数字0,直接下个循环
if k == 0 && i == '0' {
continue
//若第一个是0,第二个还是0,则不符合
if k == 1 && i == '0' && s[0] == '0' {
return "Neither"
}
//下列三种情况同时满足,表示字符不在合规的区间
if (i<'0'||i>'9')&&(i<'a'||i>'e')&&(i<'A'||i>'E') {
return "Neither"
}
}
}
return "IPv6"
}
}