题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
def ip_valid(ip):
blocks = ip.split(".")
if len(blocks) != 4 or not blocks[0]:
return False
for block in blocks:
if not block or not 0 <= int(block) <= 255:
return False
return True
def ip_type(ip):
if ip_valid(ip):
blocks = ip.split(".")
if int(blocks[0]) == 0 or int(blocks[0]) == 127:
return
elif 1 <= int(blocks[0]) <= 126:
return "A"
elif 128 <= int(blocks[0]) <= 191:
return "B"
elif 192 <= int(blocks[0]) <= 223:
return "C"
elif 224 <= int(blocks[0]) <= 239:
return "D"
elif 240 <= int(blocks[0]) <= 255:
return "E"
def isprivate(ip):
if not ip_valid(ip):
return False
blocks = ip.split(".")
if blocks[0] == "10":
return True
if blocks[0] == "172" and 16 <= int(blocks[1]) <= 31:
return True
if blocks[0] == "192" and blocks[1] == "168":
return True
def mask_valid(m):
if m == "255.255.255.255" or m == "0.0.0.0":
return False
blocks = m.split(".")
if len(blocks) != 4:
return False
mask_bit = []
for block in blocks:
mask_bit.append(bin(int(block))[2:].zfill(8))
whole_bin_mask = "".join(mask_bit)
# IT IS rfind("1") !!, looking where 1 end!!
if whole_bin_mask.rfind("1") + 1 == whole_bin_mask.find("0"):
return True
return False
ipclasscounter = {}
for i in "ABCDEIP":
ipclasscounter[i] = 0
info_list = []
while True:
try:
info_list.append(input())
except:
break
for info in info_list:
ip, mask = info.split("~")
# stupid question, need to check if ip type is in countless or not before checking the mask validity
# if the ip is in countless, even the mask is invalid, still do not count !!!!!
if ip_valid(ip) and ip_type(ip) == None:
continue
if ip_valid(ip) and mask_valid(mask):
iptp = ip_type(ip)
ipclasscounter[iptp] += 1
if isprivate(ip):
ipclasscounter["P"] += 1
else:
ipclasscounter["I"] += 1
for i in "ABCDEIP":
print(ipclasscounter[i], end=" ")
京东工作强度 418人发布
查看15道真题和解析