牛客网 BM85 合法IP

题目: https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880?tpId=295&tqId=1024725&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

project(bm_85_valid_ip)
set(CMAKE_CXX_STANDARD 20)
add_definitions(-g)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../include)
string(REPLACE ".cpp" "" file "main.cpp")
add_executable(${file}  "main.cpp")

main.cpp

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

string const IPV4 = "IPv4";
string const IPV6 = "IPv6";
string const NEITHER = "Neither";

string const IPV6_CHARS = "0123456789abcdefABCDEF";
string const IPV4_CHARS = "0123456789";

class Solution {
public:

    vector<string> split_str(string IP, char dim) {
        vector<string> res{};
        stringstream ss{IP};
        string temp;
        while(getline(ss, temp, dim)) {
            res.push_back(temp);    
        }
        return res;
    }

    bool valid_ipv6(string IP) {
        // 处理这种场景
        // aa:bb:cc:dd:ee:ff:bb:bb:
        // 最后一个冒号不应该,钻std::stringstream getline的空子
        if(IP[IP.size() - 1] == ':') {
            return false;
        }

        auto ip_vec = split_str(IP, ':');
       

        if(ip_vec.size() != 8) {
            return false;
        }

        for(auto const& ele: ip_vec) {
            if(ele.empty()) {
                return false;
            }
            if(ele.size() > 4) {
                return false;
            }

            for(auto const& ch: ele) {
                if(IPV6_CHARS.find(ch) == string::npos) {
                    return false;
                }
            }
        }
        return true;
    }

    bool is_valid_ipv4_num(string ip_num) {
        if(ip_num.empty()) {
            return false;
        }

        if(ip_num.size()>=2 && (ip_num[0] == '0')) {
            return false;
        }

        for(auto const& ch: ip_num) {
            
            if(IPV4_CHARS.find(ch) == string::npos) {
                return false;
            }
        }

        auto ip_val = atoi(ip_num.data());
        return ip_val >= 0 && ip_val <=255;
    }

    bool valid_ipv4(string IP) {
        auto ip_vec = split_str(IP, '.');
        if(ip_vec.size() != 4) {
            return false;
        }

        for(auto const& ele: ip_vec) {
            if(!is_valid_ipv4_num(ele)) {
                return false;
            }    
        }
        return true;
    }

    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    string solve(string IP) {
        // write code here
        if(IP.find(':') != string::npos) {
            if(valid_ipv6(IP)) {
                return IPV6;
            }
        } else if(IP.find('.') != string::npos) {
            if(valid_ipv4(IP)) {
                return IPV4;
            }
        } 
        
        return NEITHER;
    }
};


// 题目: https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880?tpId=295&tqId=1024725&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
int main(int argc, char* argv[]) {
    string ip_addr_str;
    Solution sol;

    while(cin >> ip_addr_str) {
        auto res = sol.solve(ip_addr_str);
        cout << res << endl;
    }
    return EXIT_SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值