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

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

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

import sys

res = [0] * 7

for line in sys.stdin:
    ip, mac = line.strip().split('~')
    ip = ip.split('.')
    mac = mac.split('.')

    if ip[0] == '0' or ip[0] == '127':
        continue

    if len(ip) < 4 or len(mac) < 4:
        res[5] += 1
        continue
    
    is_ip_wrong = False
    for sub in ip:
        if not sub.isnumeric():
            res[5] += 1
            is_ip_wrong = True
            break
        if int(sub) < 0 or int(sub) > 255:
            res[5] += 1
            is_ip_wrong = True
            break
    
    if is_ip_wrong:
        continue
    
    is_mac_wrong = False

    if mac[0] == '0' or mac[3] == '255':
        is_mac_wrong = True
        res[5] += 1
        continue

    for i in range(4):
        if is_mac_wrong:
            break
        
        if mac[i] == '0':
            if i < 3:
                if mac[i + 1] != '0':
                    is_mac_wrong = True
                    res[5] += 1
                    break
            continue

        if not mac[i].isnumeric():
            res[5] += 1
            is_mac_wrong = True
            break

        if 0 < int(mac[i]) < 128:
            res[5] += 1
            is_mac_wrong = True
            break
        temp = int(mac[i])
		
	# 判断二进制形式是否为连续的1
        for j in range(7, -1, -1):
            if is_mac_wrong:
                break
            temp -= 2**j
            if temp < 0:
                is_mac_wrong = True
                res[5] += 1
                break
            elif temp == 0:
                if i != 3 and j > 0:
			# 不是255但是是其他二进制是连续的1的数,那么mac中剩余的数必须都是0才是合法的mac
                    if mac[i+1:].count('0') != 4 - i - 1:
                        is_mac_wrong = True
                        res[5] += 1
                        break
                break
    
    if is_mac_wrong:
        continue
    
    # 判断是否为私有 ip
    if ip[0] == '10':
        res[6] += 1
    elif ip[0] == '172' and 16 <= int(ip[1]) <= 31:
        res[6] += 1
    elif ip[0] == '192' and ip[1] == '168':
        res[6] += 1

    if 1 <= int(ip[0]) <= 126:
        res[0] += 1
    elif 128 <= int(ip[0]) <= 191:
        res[1] += 1
    elif 192 <= int(ip[0]) <= 223:
        res[2] += 1
    elif 224 <= int(ip[0]) <= 239:
        res[3] += 1
    else:
        res[4] += 1


for i in res:
    print(i, end=' ')

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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