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

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

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

import sys


a,b,c,d,e,wrong,private = 0,0,0,0,0,0,0
ip_lists,subnet_mask_lists = [],[]
for line in sys.stdin:
    ip,subnet_mask = line.strip().split("~")
    thistime_ip_list = ip.split(".")
    ip_lists.append(thistime_ip_list)
    thistime_sunnet_mask_list = subnet_mask.split(".")
    subnet_mask_lists.append(thistime_sunnet_mask_list)


def check_binary_subnet(subnet_list):
    change_time = 0
    if subnet_list[0] == 0:
        return False
    for i in range(1,len(subnet_list)):
        if subnet_list[i] != subnet_list[i-1]:
            change_time += 1
        if change_time == 2:
            break
    if change_time == 0 or change_time == 2:
        return False
    else:
        return True




for i in range(len(ip_lists)):
    # 获取输入列表
    ip = ip_lists[i]
    subnet = subnet_mask_lists[i]

    # if len(ip) < 4 or len(subnet) < 4:
    #     wrong += 1
    #     continue
    frist_ipnum = int(ip[0])    
    # if ip[0].isdigit():
    #     frist_ipnum = int(ip[0])
    # else:
    #     wrong += 1
    #     continue

    # 优先判断是不是特殊情况,如果是,直接跳过
    if frist_ipnum == 0 or frist_ipnum == 127:
        continue

    # 判断正误,示例1里,子网掩码错了,IP也不算。所以一旦错了是一起的
    is_wrong = False
    binary_subnet = []
    for i  in range(4):
        # 先处理ip地址
        this_part_ip = ip[i]
        # if not this_part_ip.isdigit():
        #     is_wrong = True
        #     break
        # else:
        num = int(ip[i])
        if num<0 or num >=255:
            is_wrong = True
            break
        
        # 再看字码掩码
        # if not subnet[i].isdigit():
        #     is_wrong = True
        #     break
        # else:
        num = int(subnet[i])
        binary_num = bin(num)[2:]
        binary_subnet.extend(binary_num.zfill(8))

    if not check_binary_subnet(binary_subnet):
        is_wrong = True
    
    # 根据前面判断的正误来划分
    if is_wrong:
        wrong += 1
    else:
        if 1 <= frist_ipnum <=126:
            a+=1
            if frist_ipnum == 10:
                private += 1
        elif 128 <= frist_ipnum <= 191:
            b += 1
            if frist_ipnum == 172 and 16 <= int(ip[1]) <= 31:
                private += 1
        elif 192 <= frist_ipnum <= 223:
            c += 1
            if frist_ipnum == 192 and int(ip[1]) == 168:
                private += 1
        elif 224 <= frist_ipnum <= 239:
            d += 1
        elif 240 <= frist_ipnum <= 255:
            e += 1

print(f"{a} {b} {c} {d} {e} {wrong} {private}")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务