返回

LeetCode 468:剑指 IP,一击即中!IPv4 vs IPv6 的 C++/Java 详细攻略

后端

导言

在浩瀚的网络世界中,IP 地址扮演着至关重要的角色,犹如每个计算机和设备的独特身份标识。校验 IP 地址的有效性,对网络工程师和开发者而言,可谓是一项基本功。今天,我们将深入剖析 LeetCode 468 题:验证 IP 地址,共同探索 IPv4 和 IPv6 的奥秘。

题目概览

给定一个字符串 queryIP,你的任务是判断它是否是一个有效的 IP 地址。IP 地址可以分为 IPv4 和 IPv6 两种类型:

  • IPv4 :由四个 0~255 之间的数字组成,用点号(.)分隔,如:"192.168.1.1"
  • IPv6 :由八个 0~FFFF 之间的十六进制数组成,用冒号(:)分隔,如:"2001:0db8:85a3:08d3:1319:8a2e:0370:7334"

算法实现

C++

bool isValidIP(string queryIP) {
    int segments;
    vector<string> tokens;

    // IPv4
    if (count(queryIP.begin(), queryIP.end(), '.') == 3) {
        segments = 4;
        stringstream ss(queryIP);
        string segment;
        while (getline(ss, segment, '.')) {
            tokens.push_back(segment);
        }
    }
    // IPv6
    else if (count(queryIP.begin(), queryIP.end(), ':') == 7) {
        segments = 8;
        stringstream ss(queryIP);
        string segment;
        while (getline(ss, segment, ':')) {
            tokens.push_back(segment);
        }
    }
    // 其他情况
    else {
        return false;
    }

    // 验证段数
    if (tokens.size() != segments) {
        return false;
    }

    // 验证每个段
    for (string& token : tokens) {
        if (token.empty() || token.size() > 4) {
            return false;
        }
        if (!isValidSegment(token, segments == 4)) {
            return false;
        }
    }

    return true;
}

bool isValidSegment(string segment, bool isIPv4) {
    // IPv4
    if (isIPv4) {
        int num;
        try {
            num = stoi(segment);
        }
        catch (...) {
            return false;
        }
        return num >= 0 && num <= 255;
    }
    // IPv6
    else {
        // TODO: Implement IPv6 segment validation
    }
}

Java

class Solution {
    public boolean isValidIP(String queryIP) {
        int segments;
        String[] tokens = queryIP.split("[.:]");

        // IPv4
        if (tokens.length == 4) {
            segments = 4;
        }
        // IPv6
        else if (tokens.length == 8) {
            segments = 8;
        }
        // 其他情况
        else {
            return false;
        }

        // 验证段数
        if (tokens.length != segments) {
            return false;
        }

        // 验证每个段
        for (String token : tokens) {
            if (token.isEmpty() || token.length() > 4) {
                return false;
            }
            if (!isValidSegment(token, segments == 4)) {
                return false;
            }
        }

        return true;
    }

    private boolean isValidSegment(String segment, boolean isIPv4) {
        // IPv4
        if (isIPv4) {
            int num;
            try {
                num = Integer.parseInt(segment);
            }
            catch (NumberFormatException e) {
                return false;
            }
            return num >= 0 && num <= 255;
        }
        // IPv6
        else {
            // TODO: Implement IPv6 segment validation
        }
    }
}

SEO优化

结语

IP 地址的有效性校验看似简单,但涉及到的细节却不容小觑。通过对 LeetCode 468 题的详细分析,我们不仅掌握了 IP 地址的格式规则,还领略到了算法实现的精妙之处。愿这篇文章能为你开启 IP 地址校验之旅的新篇章,助你在网络世界的探索中一往无前!