题解 | #验证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
        //用split方法把字符串分割成字符串数组
        //对于IPv4,用.来分割成四节;IPv6,用:分割成8节
        //再对于IPv4,判断每一节,第一个为0,则长度不能超过1;字符串转数字后只能在0-255
        //对于IPv6,每一节由0-9以及a-e,A-E组成,长度不能超过四个
        if (IP.contains(".")) {
            //针对IPv4的
            String [] parts = IP.split("\\.",-1);
            if (parts.length != 4) {
                return "Neither";
            }
            for (String part : parts) {
                if (part.length() < 1 || part.length() > 3) {
                    return "Neither";
                }
                //首位为0,位数不是1
                if (part.charAt(0) == '0' && part.length() > 1) {
                    return "Neither";
                }
                //不全是数字
                for (char ch : part.toCharArray()) {
                    if (!Character.isDigit(ch)) {
                        return "Neither";
                    }
                }
                if (Integer.parseInt(part) < 0 || Integer.parseInt(part) > 255) {
                    return "Neither";
                }
            }
            return "IPv4";

        }
        if (IP.contains(":")) {
            //针对IPv6的
            String [] parts = IP.split(":",-1);
            if (parts.length != 8) {
                return "Neither";
            }
            for (String part : parts) {
                if (part.length() < 1 || part.length() > 4) {
                    return "Neither";
                }
                //除了数字,ae还有其他的
                for (char ch : part.toCharArray()) {
                    if (!isHex(ch) ) {
                        return "Neither";
                    }
                }
            }
            return "IPv6";
        }
        return "Neither";
    }

    private boolean isHex(char c) {
        if (c >= '0' && c <= '9') {
            return true;
        }
        if (c >= 'a' && c <= 'e') {
            return true;
        }
        if (c >= 'A' && c <= 'E') {
            return true;
        }
        return false;
    }
}

这题主要在于split,分割,它是用正则表达式匹配的,所以要转义。并且可能出现空字符串,影响分割个数,应该用-1来限定分割成多少个,这一点很关键。

全部评论

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务