题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

use std::io::{self, *};

struct IpAddr {
    ip: u32,
    mask: u32
}

impl IpAddr {
    fn is_valid_ip(&mut self, ip: &str) -> bool {
        let mut ipv: Vec<u8>= vec![];
        for i in ip.split(".") {
            if let Ok(j) = i.parse::<u8>() {ipv.push(j)} else {return false} 
        }
        if ipv.len() != 4 {return false}
        self.ip = ((ipv[0] as u32) << 24) + ((ipv[1] as u32) << 16) + ((ipv[2] as u32) << 8) + (ipv[3] as u32);
        true
    }
    
    fn is_other(&self) -> bool {
        let a = self.ip >> 24;
        if a == 0 || a == 127 {true} else {false}
    }

    fn is_valid_mask(&mut self, ip: &str) -> bool {
        let mut ipv: Vec<u8>= vec![];
        for i in ip.split(".") {
            if let Ok(j) = i.parse::<u8>() {ipv.push(j)} else {return false} 
        }
        if ipv.len() != 4 {return false}
        self.mask = ((ipv[0] as u32) << 24) + ((ipv[1] as u32) << 16) + ((ipv[2] as u32) << 8) + (ipv[3] as u32);
        if (self.mask << self.mask.count_ones()) != 0 {return false}
        true
    }

    fn is_private(&self) -> bool {
        let a = self.ip >> 24;
        let b = (self.ip >> 16) as u8;
        if a == 10 || a == 172 && 16 <= b && b <= 31 || a == 192 && b == 168 {true} else {false}
    }

    fn classify(&self) -> char {
        let a = self.ip >> 24;
        match a {
            n if 1 <= n && n <= 126 => 'A',
            n if 128 <= n && n <= 191 => 'B',
            n if 192 <= n && n <= 223 => 'C',
            n if 224 <= n && n <= 239 => 'D',
            n if 240 <= n && n <= 255 => 'E',
            _ => 'O',
        }
    }
}

fn main() {
    let stdin = io::stdin();
    let mut a = 0;
    let mut b = 0;
    let mut c = 0;
    let mut d = 0;
    let mut e = 0;
    let mut err = 0;
    let mut private = 0;
    unsafe {
        for line in stdin.lock().lines() {
            let ll = line.unwrap();
            let mut addrs = ll.split("~");

            let mut ip = IpAddr {ip: 0, mask: 0};
            if !ip.is_valid_ip(addrs.next().unwrap()) {
                err += 1;
            } else if ip.is_other() {
                continue
            } else if !ip.is_valid_mask(addrs.next().unwrap()) {
                err += 1;
                continue
            }
            let res = ip.classify();
            match ip.classify() {
                'A' => a += 1,
                'B' => b += 1,
                'C' => c += 1,
                'D' => d += 1,
                'E' => e += 1,
                _ => {}
            }
            if ip.is_private() {private += 1}
        }
        print!("{} {} {} {} {} {} {}", a, b, c, d, e, err, private);
    }
}

全部评论

相关推荐

收到了小米的实习offer,犹豫是否要去。。。
认真搞学习:雷总还当过首富呢,公司不算大厂算独角兽吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务