468. IPアドレスの確認
中くらい
222
関連事業
文字列が与えられます queryIP
。有効な IPv4 アドレスの場合はそれを返し "IPv4"
、有効な IPv6 アドレスの場合はそれを返し "IPv6"
、上記のタイプの IP アドレスでない場合はそれを返します "Neither"
。
有効な IPv4 アドレスは“x1.x2.x3.x4”
IP アドレスの形式 です 。ここで 0 <= xi <= 255
、 と には 先行ゼロをxi
含めることはできません 。たとえば “192.168.1.1”
、 “192.168.1.0”
は有効な IPv4 アドレス、 “192.168.01.1”
は無効な IPv4 アドレス “192.168.1.00”
、 “[email protected]”
は無効な IPv4 アドレスです。
有効な IPv6 アドレスは、 “x1:x2:x3:x4:x5:x6:x7:x8”
次の形式の IP アドレスです。
1 <= xi.length <= 4
xi
は、 数字、英小文字 ( to )、英大文字 ( to )を含む16 進文字列です。'a'
'f'
'A'
'F'
- では 先頭のゼロを使用できます
xi
。
たとえば "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
、 と は "2001:db8:85a3:0:0:8A2E:0370:7334"
有効な IPv6 アドレスであり、 と "2001:0db8:85a3::8A2E:037j:7334"
は "02001:0db8:85a3:0000:0000:8a2e:0370:7334"
無効な IPv6 アドレスです。
例 1:
入力: queryIP = "172.16.254.1" 出力: "IPv4" 説明:有効な IPv4 アドレス。"IPv4" を返します。
例 2:
入力: queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 出力: "IPv6" 説明:有効な IPv6 アドレス。"IPv6" を返します。
例 3:
入力: queryIP = "256.256.256.256" 出力: "どちらでもない" 説明: IPv4 アドレスでも IPv6 アドレスでもない
ヒント:
queryIP
英字、数字、文字、'.'
および のみで構成されます':'
。
考え方は非常にシンプルで、ルールに従って文字列検出を実行するだけですが、常に予期しない例外が発生するため、デバッグを行っています。
すぐに答えに行きましょう:
class Solution {
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1] ; //不要忘了
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while(p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
delete[] d;
delete[] strs;
return res;
}
bool isValid(char ch)
{
if(ch>='0' && ch<='9')
{
return true;
}
else if(ch>='a' && ch<='f')
{
return true;
}
else if(ch>='A' && ch<='F')
{
return true;
}
else
return false;
}
public:
string validIPAddress(string queryIP) {
int len4=0;
int len6=0;
for(auto i:queryIP)
{
if(i=='.')
{
len4++;
}
if(i==':')
{
len6++;
}
}
if(len4>0 && len4!=3)
{
return "Neither";
}
if(len6>0 && len6!=7)
{
return "Neither";
}
vector<string> ipv4Str=split(queryIP,".");
if(ipv4Str.size()==4)
{
if(queryIP[0]=='.' || queryIP[queryIP.size()-1]=='.')
{
return "Neither";
}
bool ipv4Flag=true;
for(auto i:ipv4Str)
{
int a=atoi(i.c_str());
if(a>255)
{
ipv4Flag=false;
break;
}
else
{
string tem=to_string(a);
if(tem!=i)
{
ipv4Flag=false;
break;
}
}
}
if(ipv4Flag)
{
return "IPv4";
}
else
{
return "Neither";
}
}
else
{
vector<string> ipv6Str=split(queryIP,":");
if(ipv6Str.size()==8)
{
if(queryIP[0]!=':' && queryIP[queryIP.size()-1]!=':')
{
bool ipv6Flag=true;
for(auto i:ipv6Str)
{
if(i.size()>4)
{
ipv6Flag=false;
break;
}
else
{
for(auto j:i)
{
if(!isValid(j))
{
ipv6Flag=false;
break;
}
}
}
}
if(ipv6Flag)
{
return "IPv6";
}
else
{
return "Neither";
}
}
else
{
return "Neither";
}
}
else
{
return "Neither";
}
}
}
};
コードはあまり良くありませんが、100% の場合、文字列の先頭に 0 があるかどうかを確認し、int への変換を使用してから文字列に変換します。2 つの文字列が等しい場合は、文字列はありません。そうでない場合は、文字列に変換されます。は。同時に文字列分割関数を使用していますが、この分割関数には2つのセパレータの間に何もない場合にはデータが返されないというバグがあり、これも今後の改善が必要です。