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

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

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

难点在于下面两个部分:

  1. 输入的IP地址和子网掩码是一体的,其中有一个错了,那就是错了,这时候就不要在计算IP是不是A,B,C,D,E类以及是不是私有IP地址了。
  2. 第二个难点在于判断子网掩码是否正确,我在这里使用了简单粗暴的方式“循环”。除此之外还有一种方式return ((((mark ^ (mark - 1)) >> 1) ^ mark) == -1)
def mask_func(MASK):
    if (0 < MASK[0] <= 255) and (0 < MASK[0] <= 255) and (0 < MASK[0] <= 255) and (0 < MASK[0] <= 255):
        if 0 == MASK[0] and 0 == MASK[1] and 0 == MASK[2] and 0 == MASK[3]:
            return 0
        elif 255 == MASK[0] and 255 == MASK[1] and 255 == MASK[2] and 255 == MASK[3]:
            return 0
        flag = 1
        bin_mask = ''
        for m in MASK:
            fill = 8 - len(bin(m)[2:])
            bin_mask += fill * '0' + bin(m)[2:]
        for m in str(bin_mask)[2:]:
            if flag:
                if m == '0':
                    flag = 0
            else:
                if m == '1':
                    return 0
        else:
            return 1
    else:
        return 0

count_list = [0 for x in range(7)]
while True:
    try:
        tmp = input().split('~')
    except:
        break
    ip_list = tmp[0].split('.')
    mask_list = tmp[1].split('.')
    IP = []
    MASK = []
    for ip in ip_list:
        if ip.isalnum():
            IP.append(int(ip))
        else:
            IP.append(-1)
    for mask in mask_list:
        if mask.isalnum():
            MASK.append(int(mask))
        else:
            MASK.append(-1)
            
    if (1 <= IP[0] <= 126) and (0 <= IP[1] <= 255) and (0 <= IP[2] <= 255) and (0 <= IP[3] <= 255):
        if mask_func(MASK):
            count_list[0] += 1
            if (10 == IP[0]):
                count_list[6] += 1
        else:
            count_list[5] += 1
    elif (128 <= IP[0] <= 191) and (0 <= IP[1] <= 255) and (0 <= IP[2] <= 255) and (0 <= IP[3] <= 255):
        if mask_func(MASK):
            count_list[1] += 1
            if (172 == IP[0]) and (16 <= IP[1] <= 31):
                count_list[6] += 1
        else:
            count_list[5] += 1
    elif (192 <= IP[0] <= 223) and (0 <= IP[1] <= 255) and (0 <= IP[2] <= 255) and (0 <= IP[3] <= 255):
        if mask_func(MASK):
            count_list[2] += 1
            if (192 == IP[0]) and (168 == IP[1]):
                count_list[6] += 1
        else:
            count_list[5] += 1
    elif (224 <= IP[0] <= 239) and (0 <= IP[1] <= 255) and (0 <= IP[2] <= 255) and (0 <= IP[3] <= 255):
        if mask_func(MASK):
            count_list[3] += 1
        else:
            count_list[5] += 1
    elif (240 <= IP[0] <= 255) and (0 <= IP[1] <= 255) and (0 <= IP[2] <= 255) and (0 <= IP[3] <= 255):
        if mask_func(MASK):
            count_list[4] += 1
        else:
            count_list[5] += 1
    elif (0 == IP[0]) or (127 == IP[0]):
        ...
    else:
        count_list[5] += 1
for i in count_list:
    print(i,end=' ')
        
全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440279次浏览 4490人参与
# 春招别灰心,我们一人来一句鼓励 #
41427次浏览 524人参与
# 北方华创开奖 #
107270次浏览 599人参与
# 地方国企笔面经互助 #
7916次浏览 18人参与
# 虾皮求职进展汇总 #
113709次浏览 881人参与
# 实习,投递多份简历没人回复怎么办 #
2453837次浏览 34847人参与
# 阿里云管培生offer #
119720次浏览 2219人参与
# 实习必须要去大厂吗? #
55563次浏览 960人参与
# 同bg的你秋招战况如何? #
75364次浏览 551人参与
# 提前批简历挂麻了怎么办 #
149798次浏览 1977人参与
# 投递实习岗位前的准备 #
1195641次浏览 18546人参与
# 你投递的公司有几家约面了? #
33170次浏览 188人参与
# 双非本科求职如何逆袭 #
661802次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157587次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4719次浏览 54人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11300次浏览 267人参与
# 发工资后,你做的第一件事是什么 #
12368次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35546次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20072次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39220次浏览 314人参与
# 我的上岸简历长这样 #
451897次浏览 8088人参与
# 非技术岗是怎么找实习的 #
155832次浏览 2120人参与
牛客网
牛客企业服务