ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 468. 验证IP地址

2021-05-24 18:58:30  阅读:171  来源: 互联网

标签:return 468 IP IPv6 地址 IPv4 IP地址 Neither leetcode


题目描述
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
如果是有效的 IPv4 地址,返回 “IPv4” ;
如果是有效的 IPv6 地址,返回 “IPv6” ;
如果不是上述类型的 IP 地址,返回 “Neither” 。
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;

同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 ( :: ) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。

同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

示例 1:
输入:IP = “172.16.254.1”
输出:“IPv4”
解释:有效的 IPv4 地址,返回 “IPv4”
示例 2:
输入:IP = “2001:0db8:85a3:0:0:8A2E:0370:7334”
输出:“IPv6”
解释:有效的 IPv6 地址,返回 “IPv6”
示例 3:
输入:IP = “256.256.256.256”
输出:“Neither”
解释:既不是 IPv4 地址,又不是 IPv6 地址
示例 4:
输入:IP = “2001:0db8:85a3:0:0:8A2E:0370:7334:”
输出:“Neither”
示例 5:
输入:IP = “1e1.4.5.6”
输出:“Neither”
提示:
IP 仅由英文字母,数字,字符 ‘.’ 和 ‘:’ 组成。

题解
提示的意思是不要考虑IPV6中可以缩写的情况。
牛客网上相应题目测试样例太少,会出现错误的程序被通过。因此在LeetCode上写吧。

本题目需要验证两种IP地址,两种IP地址的区分方式不一样,IPV4以‘ . ’区分,IPV6以‘ :’ 区分,

  • 先考虑如果一个字符串中两种符号都出现了,这类的字符串不属于以上两种地址

  • 首先需要实现Python中的split函数,以“.” “,” 为分割点,将字符串中的子串加入vector中,然后再做如下的判断,传入ip时尾部要加入相应的分割符

  • 如果只找到“ .” 那么就要按照IPV4的方式判断

    • 如果vector中的项数不等于4,不合法的
    • 如果每一项的长度是空或者大于3,不合法的
    • 如果每一项字符长度大于1且第一个字符为0,(有前导0)不合法的
    • 如果每一项中字符的范围不在0-9也是不合法的
    • 如果每一项转化为数字和大于255也是不合法的
  • 如果只找到“ : ” 那么就要按照IPV6的方式判断

    • 如果vector中的项数不等于8,不合法的
    • 如果每一项的长度是空或者大于4,不合法的
    • 如果每一项中字符的范围不在 0-9 或者不在 a-f 或者 A-F 也是不合法的
class Solution {
public:
    vector<string> split(string ip,char t)
    {
        vector<string> res;
        for(int i=0;i<ip.size();i++)
        {
            int j=i;
            string items;
            while(ip[j]!=t) 
            {
                items+=ip[j];
                j++;
            }
            i=j;
            res.push_back(items);
        }
        return res;
    }
    string check_ipv4(string ip)
    {
        auto items=split(ip+'.','.');
        if(items.size()!=4) return "Neither";
        for(auto x:items)
        {
            if(x.empty()||x.size()>3) return "Neither";
            if(x[0]=='0' && x.size()>1) return "Neither";
            for(char c:x)
            {
                if(c<'0' ||c>'9') return "Neither";
            }
            int t=stoi(x);
            if(t>255) return "Neither";
        }
        return "IPv4";

    }

    bool check(char c)
    {
        if(c>='0' &&c<='9') return true;
        if(c>='a' &&c<='f') return true;
        if(c>='A' &&c<='F') return true;
        return false;
    }
    
    string check_ipv6(string ip)
    {
        auto items=split(ip+':',':');
        if(items.size()!=8) return "Neither";
        for(auto x:items)
        {
            if(x.empty()||x.size()>4) return "Neither";
            for(auto c:x)
            {
                if(!check(c)) return "Neither";
            }
        }
        return "IPv6";
    }

    string validIPAddress(string IP) {
        if(IP.find(':')!=-1 &&IP.find('.')!=-1) return "Neither";
        if(IP.find(':')!=-1) return check_ipv6(IP);
        if(IP.find('.')!=-1) return check_ipv4(IP);
        return "Neither";
    }
};

标签:return,468,IP,IPv6,地址,IPv4,IP地址,Neither,leetcode
来源: https://blog.csdn.net/yangyangcome/article/details/117229375

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有