leetcode 468 IP アドレスが有効であることを確認します (2 時間かかりました)

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つのセパレータの間に何もない場合にはデータが返されないというバグがあり、これも今後の改善が必要です。

おすすめ

転載: blog.csdn.net/weixin_41579872/article/details/128167743
おすすめ