题解 | #识别有效的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地址和掩码并进行分类统计#
查看3道真题和解析