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

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

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

def ip_valid(ip):
    blocks = ip.split(".")
    if len(blocks) != 4 or not blocks[0]:
        return False
    for block in blocks:
        if not block or not 0 <= int(block) <= 255:
            return False
    return True


def ip_type(ip):
    if ip_valid(ip):
        blocks = ip.split(".")
        if int(blocks[0]) == 0 or int(blocks[0]) == 127:
            return
        elif 1 <= int(blocks[0]) <= 126:
            return "A"
        elif 128 <= int(blocks[0]) <= 191:
            return "B"
        elif 192 <= int(blocks[0]) <= 223:
            return "C"
        elif 224 <= int(blocks[0]) <= 239:
            return "D"
        elif 240 <= int(blocks[0]) <= 255:
            return "E"


def isprivate(ip):
    if not ip_valid(ip):
        return False
    blocks = ip.split(".")
    if blocks[0] == "10":
        return True
    if blocks[0] == "172" and 16 <= int(blocks[1]) <= 31:
        return True
    if blocks[0] == "192" and blocks[1] == "168":
        return True


def mask_valid(m):
    if m == "255.255.255.255" or m == "0.0.0.0":
        return False
    blocks = m.split(".")
    if len(blocks) != 4:
        return False
    mask_bit = []
    for block in blocks:
        mask_bit.append(bin(int(block))[2:].zfill(8))
    whole_bin_mask = "".join(mask_bit)
    # IT IS rfind("1") !!, looking where 1 end!!
    if whole_bin_mask.rfind("1") + 1 == whole_bin_mask.find("0"):
        return True
    return False


ipclasscounter = {}
for i in "ABCDEIP":
    ipclasscounter[i] = 0
info_list = []
while True:
    try:
        info_list.append(input())
    except:
        break

for info in info_list:
    ip, mask = info.split("~")
    # stupid question, need to check if ip type is in countless or not before checking the mask validity
    # if the ip is in countless, even the mask is invalid, still do not count !!!!!
    if ip_valid(ip) and ip_type(ip) == None:
        continue
    if ip_valid(ip) and mask_valid(mask):
        iptp = ip_type(ip)
        ipclasscounter[iptp] += 1
        if isprivate(ip):
            ipclasscounter["P"] += 1
    else:
        ipclasscounter["I"] += 1

for i in "ABCDEIP":
    print(ipclasscounter[i], end=" ")

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

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