In this problem, your job to write a function to check whether a input string is a valid IPv4 address or IPv6 address or neither.

IPv4 addresses are canonically represented in dot-decimal notation, which consists of four decimal numbers, each ranging from 0 to 255, separated by dots ("."), e.g.,172.16.254.1;

Besides, you need to keep in mind that leading zeros in the IPv4 is illegal. For example, the address 172.16.254.01 is illegal.

IPv6 addresses are represented as eight groups of four hexadecimal digits, each group representing 16 bits. The groups are separated by colons (":"). For example, the address 2001:0db8:85a3:0000:0000:8a2e:0370:7334 is a legal one. Also, we could omit some leading zeros among four hexadecimal digits and some low-case characters in the address to upper-case ones, so 2001:db8:85a3:0:0:8A2E:0370:7334 is also a valid IPv6 address(Omit leading zeros and using upper cases).

However, we don't replace a consecutive group of zero value with a single empty group using two consecutive colons (::) to pursue simplicity. For example, 2001:0db8:85a3::8A2E:0370:7334 is an invalid IPv6 address.

Besides, you need to keep in mind that extra leading zeros in the IPv6 is also illegal. For example, the address 02001:0db8:85a3:0000:0000:8a2e:0370:7334 is also illegal.

Note: You could assume there is no extra space in the test cases and there may some special characters in the input string.

Example 1:

Input: "172.16.254.1"

Output: "IPv4"

Explanation: This is a valid IPv4 address, return "IPv4".

Example 2:

Input: "2001:0db8:85a3:0:0:8A2E:0370:7334"

Output: "IPv6"

Explanation: This is a valid IPv6 address, return "IPv6".

Example 3:

Input: "256.256.256.256"

Output: "Neither"

Explanation: This is neither a IPv4 address nor a IPv6 address.

这道题让我们验证两种IP地址,LeetCode之前有一道关于IPv4的题Restore IP Addresses,给我们了一个字符串,让我们通过在中间加点来找出所有正确的IP地址,这道题给了我们中间加点或者冒号的字符串,让我们验证其是否是正确的IPv4或者IPv6,感觉要稍稍复杂一些。那么我们只有分别来验证了,那么我们怎么样能快速的区别是IPv4或者IPv6呢,当然是通过中间的点或者冒号啦,所以我们首先在字符串中找冒号(当然你想找点也可以),如果字符串中没有冒号,那么我们来验证其是否是IPv4,如果有冒号,我们就来验证其是否是IPv6.

首先对于IPv4,我们使用getline函数来截取两个点之间的字符串,我们还需要一个计数器cnt来记录我们已经截取了多少段,如果cnt大于4了,说明超过了4段,说明是不是正确的地址。如果取出的字符串为空,说明两个点连在一起了,也不对。再有就是如果字符串长度大于1,且第一个字符是0,也不对。由于IPv4的地址在0到255之间,所以如果字符串长度大于3,也不正确。下面我们检查每一个字符,如果有不是数字的字符,返回Neither。最后我们再把字符串转为数字,如果不在0到255之间就是非法的。最后的最后,我们要保证cnt正好为4,而且最后一个字符不能是点,统统满足以上条件才是正确的IPv4地址。

然后对于IPv6,我们也使用getline函数来截取两个冒号之间的字符串,我们同样需要计数器cnt来记录我们已经截取了多少段,如果cnt大于8了,说明超过了8段,说明是不是正确的地址。如果取出的字符串为空,说明两个冒号连在一起了,也不对。面我们检查每一个字符,正确的字符应该是0到9之间的数字,或者a到f,或A到F之间的字符,如果出现了其他字符,返回Neither。最后的最后,我们要保证cnt正好为8,而且最后一个字符不能是冒号,统统满足以上条件才是正确的IPv6地址。

class Solution {
public:
string validIPAddress(string IP) {
istringstream is(IP);
string t = "";
int cnt = ;
if (IP.find(':') == string::npos) { // Check IPv4
while (getline(is, t, '.')) {
++cnt;
if (cnt > || t.empty() || (t.size() > && t[] == '') || t.size() > ) return "Neither";
for (char c : t) {
if (c < '' || c > '') return "Neither";
}
int val = stoi(t);
if (val < || val > ) return "Neither";
}
return (cnt == && IP.back() != '.') ? "IPv4" : "Neither";
} else { // Check IPv6
while (getline(is, t, ':')) {
++cnt;
if (cnt > || t.empty() || t.size() > ) return "Neither";
for (char c : t) {
if (!(c >= '' && c <= '') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) return "Neither";
}
}
return (cnt == && IP.back() != ':') ? "IPv6" : "Neither";
}
}
};

类似题目:

Restore IP Addresses

参考资料:

https://discuss.leetcode.com/topic/71572/java-solution

https://discuss.leetcode.com/topic/71418/short-regexp-solution/5

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Validate IP Address 验证IP地址的更多相关文章

  1. 468 Validate IP Address 验证IP地址

    详见:https://leetcode.com/problems/validate-ip-address/description/ Java实现: class Solution { public St ...

  2. [Leetcode] restore ip address 存储IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  3. [LintCode] Restore IP Address 复原IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  4. 华东师大OJ:IP Address【IP地址转换】

    /*===================================== IP Address Time Limit:1000MS Memory Limit:30000KB Total Subm ...

  5. IP池验证IP是否可用 及scrapy使用 ip池

    简单验证 import requests url = "http://www.baidu.com/"proxies = {"http": "http: ...

  6. Windows Azure Cloud Service (44) 将Cloud Service加入Virtual Network Subnet,并固定Virtual IP Address(VIP)

    <Windows Azure Platform 系列文章目录> 在之前的文章中,笔者已经详细介绍了如何将Virtual Machine加入Virtual Network,并且绑定固定的Pr ...

  7. VIP - virtual IP address

    virtual IP address (虚拟 IP 地址)1.是集群的ip地址,一个vip对应多个机器2.与群集关联的唯一 IP 地址 see wiki: A virtual IP address ( ...

  8. 【LeetCode】468. Validate IP Address 解题报告(Python)

    [LeetCode]468. Validate IP Address 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  9. Java实现 LeetCode 468 验证IP地址

    468. 验证IP地址 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址. IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(&qu ...

随机推荐

  1. Vertica 分区表设计

    Vertica数据库中的表只是一个逻辑概念. 实际存储在磁盘上的是projection. 当创建一张表,没有创建projection时,那么插入数据的时候会自动创建一个默认的projection.如果 ...

  2. 压力测试之badboy和Jmeter的简单使用方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 所谓压力测试是指,通过确定一个系统的瓶颈或者不能接收的性能点, ...

  3. nodejs中使用http请求返回值为html时乱码问题

    今天用nodejs进行http请求时返回的数据是一个html文件,然后我还是按照以前解析json数据的方法.果不其然报错了:SyntaxError: Unexpected token  in JSON ...

  4. PHP实现全排列(递归算法)

    算法描述:如果用P表示n个元素的全排列,而Pi表示n个元素中不包含元素i的全排列,(i)Pi表示在排列Pi前面加上前缀i的排列,那么n个元素的全排列可递归定义为:    ① 如果n=1,则排列P只有一 ...

  5. Android测试提升效率批处理脚本(三)

    前言: 前面放出过几次批处理,这次只放一个环境检查的被管理员给打回来了,不得不再找找几个有含金量的放出来,请看正文~~~ 目录 1.Android环境检查 2.Android内存监控 3.模拟蓝牙手柄 ...

  6. Uri各个属性取值测试

    asp.net代码: Uri h_uri = new Uri("http://hovertree.com/tiku/bjaf/3ntux9r9.htm?hewenqi#hewenqipl?d ...

  7. 在Azure上的VM镜像库中找到想要的镜像

    Azure上的虚机镜像库中, 有很多的镜像,其中当然也包括了用户自定义上传的镜像. 在Powershell中如果想使用这些镜像的话, 则需要知道其名称 下面这条命令,可以获得所有的镜像信息 $imag ...

  8. [python] CSV read and write using module xlrd and xlwt

    1. get data from csv, skip header of the file. with open('test_data.csv','rb,) as csvfile: readCSV = ...

  9. enumerate用法总结-Python 3

    enumerate()说明 enumerate()是python的内置函数 enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enum ...

  10. Autodesk 为其云技术发布新品牌- Autodesk Forge

    近些年来Autodesk陆续发布了不少云解决方案和服务,比如BIM 360, Infraworks 360,Autodesk 360/A360, AutoCAD 360等等,这些众多叫做360的产品或 ...