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

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

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

import sys


def is_valid_ip(ip):
    # 检查 IP 地址的合法性
    parts = ip.split(".")
    if len(parts) != 4:
        return False
    for part in parts:
        if not part.isdigit() or not 0 <= int(part) <= 255:
            return False
    return True


def is_valid_mask(mask):
    # 检查子网掩码的合法性
    binary_mask = "".join(format(int(x), "08b") for x in mask.split("."))
    # print(binary_mask)
    if "0" in binary_mask.rstrip("0") or binary_mask.strip("0") == "" or binary_mask.strip("1") == "":
        return False
    return True


def classify_ip(ip, mask):

    ip_parts = list(map(int, ip.split(".")))
    a_range = range(1, 127)
    b_range = range(128, 192)
    c_range = range(192, 224)
    d_range = range(224, 240)
    e_range = range(240, 256)

    if not is_valid_ip(ip) or not is_valid_mask(mask):
        if ip_parts[0] != 0 and ip_parts[0] != 127:
            return "Error"

    if ip_parts[0] in a_range:
        if ip_parts[0] == 10 and 0 <= ip_parts[1] <= 255 and 0 <= ip_parts[2] <= 255 and 0 <= ip_parts[3] <= 255:
            return ["Private", "A"]
        return "A"
    elif ip_parts[0] in b_range:    
        if ip_parts[0] == 172 and 16 <= ip_parts[1] <= 31 and 0 <= ip_parts[2] <= 255 and 0 <= ip_parts[3] <= 255:
            return ["Private", "B"]
        return "B"
    elif ip_parts[0] in c_range:
        if ip_parts[0] == 192 and ip_parts[1] == 168 and 0 <= ip_parts[2] <= 255 and 0 <= ip_parts[3] <= 255:
            return ["Private", "C"]
        return "C"
    elif ip_parts[0] in d_range:
        return "D"
    elif ip_parts[0] in e_range:
        return "E"
    else:
        if ip_parts[0] != 0 and ip_parts[0] != 127:
            return "Error"
        else:
            return "Not in Charge"

# 统计各类别的个数
counts = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0, "Error": 0, "Private": 0, "Not in Charge":0}

lines = []

# 输入多行字符串
for line in sys.stdin:
    a = line.strip("\n")
    lines.append(a)

for line in lines:
    ip, mask = line.split("~")
    category = classify_ip(ip, mask)
    if type(category) is list:
        counts[category[0]] += 1
        counts[category[1]] += 1
    else:
        counts[category] += 1

# 输出统计结果
for i in counts.keys():
    if i != "Not in Charge":
        print(counts[i], end=" ")

全部评论

相关推荐

05-12 22:16
已编辑
北京邮电大学 研发工程师
牛客302360988号:0offer+1 滴滴都不给我面 佬没投鹅吗,鹅应该很喜欢北邮吧
投递美团等公司6个岗位
点赞 评论 收藏
分享
ming_ri:“很抱歉,您的简历和我们当前的职位需求不是很匹配”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务