加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
m_468.cpp 3.82 KB
一键复制 编辑 原始数据 按行查看 历史
yuetan 提交于 2020-08-17 22:14 . leetcode
/*
468. 验证IP地址
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
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 是无效的。
*/
//思路:分v4和v6讨论,
//可以先写一个spilt函数,返回.号或者:分割的字符串数组,类型vector<string>,入参 string类型 IP地址字符串,char型分隔符,int类型分隔符的个数
//再遍历spilt函数的返回值,按照v4和v6的格式去判断
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
string validIPAddress(string IP) {
if (IP.size()>40)
return "Neither";
if (CheckIPv4(IP)) {
return "IPv4";
};
if (CheckIPv6(IP)) {
return "IPv6";
};
return "Neither";
}
bool CheckIPv4(string IP) {
vector<string> strArray;
char space = '.';
int num = 0;
strArray = SpiltByChar(IP, space, num);
if (strArray.size()!=4 || num!=3) {
return false;
}
for (auto c : strArray) {
if(!IPv4StrHelp(c)) {
return false;
}
}
return true;
}
bool IPv4StrHelp(string str) {
if (str == "0")
return true;
if (str[0] == '0')
return false;
int sum = 0;
for (auto c : str) {
if (c < '0' || c > '9') return false;
sum = (c - '0') + sum * 10;
if (sum > 255) return false;
}
return true;
}
bool CheckIPv6(string IP) {
vector<string> strArray;
char space = ':';
int num = 0;
strArray = SpiltByChar(IP, space, num);
if (strArray.size()!=8 || num!=7) {
return false;
}
for (auto c : strArray) {
if(!IPv6StrHelp(c)) {
return false;
}
}
return true;
}
bool IPv6StrHelp(string str) {
if (str.size() > 4)
return false;
for (auto c : str) {
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
} else {
return false;
}
}
return true;
}
vector<string> SpiltByChar(string inputIP, char c, int &num) {
int l = 0;
vector<string> strArray;
for (int i = 0; i < inputIP.size(); i++) {
if (inputIP[i] == c) {
num++;
if (l <= i - 1) {
strArray.push_back(inputIP.substr(l, i - l));
l = i + 1;
}
}
}
if (l <= inputIP.size() - 1) {
strArray.push_back(inputIP.substr(l, inputIP.size() - 1));
}
return strArray;
}
};
int main(int argc, char **argv) {
Solution s;
string IP = "10.125.152.125";
cout<<s.validIPAddress(IP)<<endl;
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化