题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
use std::io::{self, *};
struct Ip {
n: u32
}
impl Ip {
fn is_valid(&mut self, i: &str) -> bool {
let t = i.split(".").map(|i| { i.parse::<u32>().unwrap_or(256) }).collect::<Vec<u32>>();
if t.len() != 4 || t.iter().any(|i| { !((0..256).contains(i)) }) { return false }
self.n = (t[0] << 24) + (t[1] << 16) + (t[2] << 8) + t[3];
true
}
fn is_valid_mask(&self) -> bool {
(self.n << self.n.count_ones()) == 0
}
fn in_same_subnet(&self, other: &Ip, mask: &Ip) -> bool {
return (self.n & mask.n) == (other.n & mask.n)
}
}
fn main() {
let stdin = io::stdin();
let lines = stdin.lock().lines().map(|line| {
line.unwrap().trim().to_string()
}).collect::<Vec<String>>();
for i in 0..(lines.len() / 3) {
let mut mask = Ip {n:0};
let mut ip1 = Ip {n:0};
let mut ip2 = Ip {n:0};
if !mask.is_valid(&lines[i * 3]) || !ip1.is_valid(&lines[i * 3 + 1]) || !ip2.is_valid(&lines[i * 3 + 2]) {
println!("1");
} else if !mask.is_valid_mask() {
println!("1");
} else if ip1.in_same_subnet(&ip2, &mask) {
println!("0");
} else {
println!("2");
}
}
}
查看30道真题和解析
