题解 | #验证IP地址#

验证IP地址

https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        if (isIpv4(IP)) {
            return "IPv4";
        } else if (isIpv6(IP)) {
            return "IPv6";
        } else {
            return "Neither";
        }
    }

    public boolean isIpv4 (String IP) {
        // 注意.在正则表达式里有含义,需要双转义符\\转义
        String[] splits = IP.split("\\.", -1);
        if (splits.length != 4) {
            // 不是4组,不是Ipv4
            return false;
        }
        for (int i = 0; i < 4; i++) {
            // 验证每一组
            String s = splits[i];
            // 1.长度为0
            if (s.length() == 0) {
                return false;
            }
            // 2.以0开头
            if (s.startsWith("0") && s.length() > 1) {
                return false;
            }
            // 3.存在非数字情况
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                boolean yes = c >= '0' && c <= '9';
                if (!yes) {
                    return false;
                }
            }
            // 4.大小不对
            int n = Integer.parseInt(s);
            if (n < 0 || n > 255) {
                return false;
            }
        }
        return true;
    }

    public boolean isIpv6 (String IP) {
        // 注意!第二个参数为整数,代表最多分这么多组,最后一组包含所有未分的字符串内容
        // 第二个参数为0或空,代表尽可能分组,但是连续的符号被视为一个,且忽略最后单独一个
        // ":" -> []
        // "2001:0db8:85a3:0:0:8A2E:0370:7334:" -> ["2001", "0db8", "85a3", "0", "0", "8A2E", "0370", "7334"]
        // 第二个参数为负数,代表尽可能分组,且连续符号会出现长度为0的组
        // ":" -> ["", ""]
        // "2001:0db8:85a3:0:0:8A2E:0370:7334:" -> ["2001", "0db8", "85a3", "0", "0", "8A2E", "0370", "7334", ""]
        String[] splits = IP.split(":", -1);
        if (splits.length != 8) {
            // 不是8组,不是Ipv6
            return false;
        }
        for (int i = 0; i < 8; i++) {
            // 验证每一组
            String s = splits[i];
            // 1.0位或超过4位
            if (s.length() == 0 || s.length() > 4) {
                return false;
            }
            // 2.出现a-f或A-F外的英文字符
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                boolean yes = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
                if (!yes) {
                    return false;
                }
            }
        }
        return true;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务