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

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

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

def is_valid_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):
    if not is_valid_ip(mask):
        return False
    binary_str = ''.join(f'{int(x):08b}' for x in mask.split('.'))
    if '01' in binary_str or binary_str == '0'*32 or binary_str == '1'*32:
        return False
    return True

def ip_class(ip):
    parts = list(map(int, ip.split('.')))
    if 1 <= parts[0] <= 126:
        return 'A'
    elif 128 <= parts[0] <= 191:
        return 'B'
    elif 192 <= parts[0] <= 223:
        return 'C'
    elif 224 <= parts[0] <= 239:
        return 'D'
    elif 240 <= parts[0] <= 255:
        return 'E'
    return 'Error'

def is_private_ip(ip):
    parts = list(map(int, ip.split('.')))
    if parts[0] == 10:
        return True
    if parts[0] == 172 and 16 <= parts[1] <= 31:
        return True
    if parts[0] == 192 and parts[1] == 168:
        return True
    return False

import sys
input = sys.stdin.read
data = input().strip().split('\n')

counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'Error': 0, 'Private': 0}

for line in data:
    if '~' not in line:
        continue
    ip, mask = line.split('~')
    if ip.split('.')[0] in {'0', '127'}:  # 检查是否是特殊IP段,如果是则跳过
        continue
    if not (is_valid_ip(ip) and is_valid_mask(mask)):
        counts['Error'] += 1
        continue
    cls = ip_class(ip)
    if cls == 'Error':
        counts['Error'] += 1
    else:
        counts[cls] += 1
        if is_private_ip(ip):
            counts['Private'] += 1

output = ' '.join(str(counts[key]) for key in ['A', 'B', 'C', 'D', 'E', 'Error', 'Private'])
print(output)

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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