题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import sys
res = [0 for i in range(7)]
"""
A 0
B 1
C 2
D 3
E 4
error_ip or error_mask 5
private ip :6
"""
def checkIP_Class(ip_list):
if 1 <= ip_list[0] <= 126:
res[0] += 1 # A
if 128 <= ip_list[0] <= 191:
res[1] += 1 # B
if 192 <= ip_list[0] <= 223:
res[2] += 1 # C
if 224 <= ip_list[0] <= 239:
res[3] += 1 # D
if 240 <= ip_list[0] <= 255:
res[4] += 1 # E
# priveate ip_addr
if (ip_list[0] == 10 and 0 <= ip_list[1] <= 255)\
or (ip_list[0] == 172 and 16 <= ip_list[1] <= 31)\
or (ip_list[0] == 192 and ip_list[1] == 168):
res[6] += 1
# mask: list[int]
def checkMask(mask: list[int]):
mask_value = (mask[0] << 24) + (mask[1] << 16) + (mask[2] << 8) + mask[3]
# print(mask_value)
mask_bin = bin(mask_value)[2:]
# print(mask_bin)
s0 = mask_bin.find("0") # 返回最低位索引
s1 = mask_bin.rfind("1") # 返回最高位索引
if s0 != -1 and s1 != -1 and s0 - s1 == 1:
return True
return False
for line in sys.stdin:
ip, mask = line.strip().split("~")
ip = [int(x) for x in ip.split(".") if x]
mask = [int(x) for x in mask.split(".") if x]
if ip[0]==0 or ip[0]==127: #判断不计数的IP addr
continue
if len(ip) < 4 or len(mask) < 4:
res[5] += 1
continue
if checkMask(mask):
checkIP_Class(ip)
else:
res[5] += 1
print(*res)
