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

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

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

import sys

# 将ip 转成32位二进制字符串
def ip2bin(ipv4):
    return ''.join([bin(int(s))[2:].rjust(8,'0') for s in ipv4.split('.')])

# 将ip 转成数字好比较
def ip2int(ipv4):
    return int(ip2bin(ipv4),base=2)

# 检查ipv4是否合法 按照题意
def check_ipv4(ipv4):
    ipv4_list = ipv4.split('.')
    valid_list = range(0, 256)
    for item in ipv4_list:
        if not item.isdigit() or not int(item) in valid_list:
            return False
    return True

# 检查掩码是否合法 按照题意
def check_mask(mask):
    #mask 地址 一定是IP地址
    if not check_ipv4(mask):
        return False
    # 方案1 使用内置字符串查找,从右往左查到第一个1的前面,看有没有零
    mask_bin = ip2bin(mask)
    if mask_bin[mask_bin.find('0'):].find('1') != -1:
        return False
    return True
    # 方案2 因为ipv4 mask最多就31个,可以穷举比较
    # valid_list = []
    # mask_bin = ip2bin(mask)
    # for item in range(1, 32):
    #     valid_list.append(('1'*item).ljust(32,'0'))
    # return mask_bin in valid_list

# 计算所有的ipv4类型范围
def get_ipv4_types():
    return  {
        'A' : [ip2int('1.0.0.0'),ip2int('126.255.255.255')],
        'B' : [ip2int('128.0.0.0'),ip2int('191.255.255.255')],
        'C' : [ip2int('192.0.0.0'),ip2int('223.255.255.255')],
        'D' : [ip2int('224.0.0.0'),ip2int('239.255.255.255')],
        'E' : [ip2int('240.0.0.0'),ip2int('255.255.255.255')],
        'P': [[ip2int('10.0.0.0'),ip2int('10.255.255.255')],[ip2int('172.16.0.0'),ip2int('172.31.255.255')],[ip2int('192.168.0.0'),ip2int('192.168.255.255')]]
    }

# 所有的类型对应的范围
all_ipv4_types = get_ipv4_types()
# 结果列表
reslist = {
    'A':0,
    'B':0,
    'C':0,
    'D':0,
    'E':0,
    'INVALID':0,
    'P':0,
}

for item in sys.stdin:
    ip_mask = item.strip()  # 去掉换行符
    ipv4,mask = ip_mask.split('~')
    # 题目要求第一点
    if ipv4.split('.')[0] == '0' or ipv4.split('.')[0] == '127':
        continue
    if not check_ipv4(ipv4) or not check_mask(mask):
        reslist['INVALID'] += 1
        continue
    ipv4_int = ip2int(ipv4)
    # 检查是否位私有地址
    for item in all_ipv4_types['P']:
        if item[0] <= ipv4_int and ipv4_int<= item[1]:
            reslist['P'] += 1
            break
    for key,value in all_ipv4_types.items():
        if key != "P" and value[0] <= ipv4_int and ipv4_int <= value[1]:    
            reslist[key] += 1
            break

for k,v in reslist.items():
    print(v, end=" ")

#识别有效的IP地址和掩码并进行分类统计#
全部评论

相关推荐

牛客吹哨人:哨哥晚点统一更新到黑名单:能救一个是一个!26届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1525833
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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