Leetcode——468. Validate IP Address
来源:互联网 发布:手机拍一寸照片软件 编辑:程序博客网 时间:2024/05/16 01:33
题目
Write a function to check whether an 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, leading zeros in the IPv4 is invalid. For example, the address 172.16.254.01 is invalid.
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 valid 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, extra leading zeros in the IPv6 is also invalid. For example, the address 02001:0db8:85a3:0000:0000:8a2e:0370:7334 is invalid.
Note: You may assume there is no extra space or 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.
https://leetcode.com/problems/validate-ip-address/?tab=Description
Solution
这一题是判断一个输入的字符串是否是合法的IPv4或者IPv6,其实思路很简单,最主要的困难就是各种异常情况的判断。
整理一下:
1、 这里要写两个函数,一个是判断一个字符串是否是IPv4,一个是判断一个字符串是否是IPv6。
2、 判断IPv4的函数
首先遍历该字符串寻找以分隔符’.’,注意,寻找分隔符只能把前三个数字找出来,所以需要借助字符串的结束符’\0’来把最后一个字符找出来。
之后对每次找到的数字,进行合理性判断。
另外,stoi()是把字符串转化为正数,但是对于长度很长的字符串,比如”11111111111111111111111111111”,stoi是会报错的,所以,在转化之前,可以先对分割后的字符串进行长度判断,如果大于等于4,说明不合法。另外,为了排除”..”即两个分隔符连着一块的,需要对分割后的字符串是否为空进行判断。
3、 判断IPv6的函数
基本和IPv4的相同,还是需要注意边界条件
class Solution {public: string validIPAddress(string IP) { if(IsIPv4(IP)) return "IPv4"; else if(IsIPv6(IP)) return "IPv6"; else return "Neither"; }private: bool IsIPv4(string IP) { string temp=""; int count=0; int count1=0; for(int i=0;i<=IP.length();i++) { if(IP[i]!='.'&&IP[i]!='\0') { if(IP[i]<'0'||IP[i]>'9') return false; temp=temp+IP[i]; count1++; if(count1>=4)//exclude:“11111111111111111111111111111.0.1.1”,stoi("111111111111111111111") will report wrong return false; } else { if(temp!=""&&stoi(temp)<256&&stoi(temp)>=0)//temp!="" in order to exclude "1..1.1.1" { if(temp[0]=='0'&&temp.length()>1) return false;//exclude:“1.00.1.1” count++; if(count==4) return i==IP.length(); } else return false; temp=""; count1=0; } } return false; } bool IsIPv6(string IP) { string temp=""; int count=0; int count1=0; for(int i=0;i<=IP.length();i++) { if((IP[i]>='0'&&IP[i]<='9')||(IP[i]>='A'&&IP[i]<='F')||(IP[i]>='a'&&IP[i]<='f')) { count1++; if(count1>4) return false; } else if(IP[i]==':'||IP[i]=='\0') { if(count1==0) return false;//In order to exclude"1::1:1:1:1:1:1:1 count++; count1=0; if(count==8) return i==IP.length(); } else return false; } return false; }};
- Leetcode——468. Validate IP Address
- LeetCode 468. Validate IP Address
- LeetCode 468. Validate IP Address
- Leetcode-468. Validate IP Address
- 【Leetcode】468. Validate IP Address
- LeetCode 468. Validate IP Address
- leetcode:468. Validate IP Address
- leetcode 468. Validate IP Address
- [leetcode]468. Validate IP Address
- 【C语言】LeetCode 468. Validate IP Address
- [Leetcode] 468. Validate IP Address 解题报告
- 468. Validate IP Address
- 468. Validate IP Address
- 468. Validate IP Address
- Leetcode 468 Validate IP Address
- Leetcode 468. Validate IP Address 验证IP地址 解题报告
- leetcode 468. Validate IP Address 有效的IP检查
- LeetCode 题解(Week 14):468. Validate IP Address
- 万亿级数据洪峰下的分布式消息引擎
- mysql存储过程和触发器 --- 一次很有意思的尝试
- P1048 采药
- 通过SQL Server命令行启动及停止SQL服务的方法
- JVM(java 虚拟机)内存设置
- Leetcode——468. Validate IP Address
- [ SSH 两种验证方式原理 ]
- 关于安卓开发关闭系统软键盘问题
- java基本语法-static关键字
- mongodb的启动及相关操作
- 方维o2o V5.06:新增全功能微信公众平台模块+微店系统+代理商模块+外卖预定模块+三级分销系统模块
- Python全局变量与global语句
- C#TCP Socket网络编程(异步通信方式)
- 关于SqlServer服务无法启动的症状分析和解决方法