题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
# 分成3个函数1个正式检查 检查是否是正常的ip和mask 检查是否是正常掩码 检查是否是私有ip
def check_ip(ip:str):
ip_bit = ip.split('.')
if len(ip_bit)!=4 or "" in ip_bit:
return False
for i in ip_bit:
if int(i)<0 or int(i)>255:
return False
return True
def check_mask(mask:str):
if not check_ip(mask): # 错误 调用函数,不用(mask:str)
return False
if mask =="255.255.255.255" or mask == "0.0.0.0":
return False
mask_list = mask.split('.')
# if len(mask_list) != 4:
# return False
mask_bit=[]
for i in mask_list:
i = bin(int(i))
i=i[2:]
mask_bit.append(i.zfill(8))
whole_mask = ''.join(mask_bit)
whole0_find = whole_mask.find("0")
whole1_fine = whole_mask.rfind("1")
if whole1_fine+1 == whole0_find:
return True
else:
return False
def check_private_ip(ip:str):
ip_list = ip.split('.')
if ip_list[0]=="10":return True
if ip_list[0]=="172" and 16<=int(ip_list[1])<=31: return True
if ip_list[0]=="192" and ip_list[1]=="168":return True
return False
ipClass2num = {
'A':0,
'B':0,
'C':0,
'D':0,
'E':0,
'ERROR':0,
'PRIVATE':0,
}
while True:
try:
s = input()
ip = s.split('~')[0]
mask = s.split('~')[1]
if check_ip(ip):
first=int(ip.split('.')[0])
if first==127 or first==0:
continue
if check_mask(mask):
if check_private_ip(ip):
ipClass2num['PRIVATE']+=1
if 0<first<127:
ipClass2num['A'] +=1
elif 127<first<=191:
ipClass2num['B']+=1
elif 192<=first<=223:
ipClass2num['C']+=1
elif 224<=first<=239:
ipClass2num['D']+=1
elif 240<=first<=255:
ipClass2num['E']+=1
else:
ipClass2num['ERROR']+=1
else:
ipClass2num['ERROR']+=1
except:
break
for v in ipClass2num.values():
print(v,end=' ')
# # 检查ip 或者mask 如果有空值,非4位,小于或者大于255的统统都是错误ip,返回false
# def check_ip(ip:str):
# ip_bit = ip.split('.')
# if len(ip_bit) != 4 or '' in ip_bit: #ip 的长度为4 且每一位不为空
# return False
# for i in ip_bit:
# if int(i)<0 or int(i) >255: #检查Ip每一个10位的值范围为0~255
# return False
# return True
# # 掩码 是否 全部是111+000的形式 通过1的索引+1 = 0的所引
# def check_mask(mask:str):
# #如果有空值 非4位 小于0大于255 在这个函数也是返回false
# if not check_ip(mask):
# return False
# # 如果掩码 是开头 或者结尾 也是false
# if mask == '255.255.255.255' or mask == '0.0.0.0':
# return False
# mask_list = mask.split('.')
# # 是不是多余了?
# if len(mask_list) != 4:
# return False
# # 将掩码按照每个8位数拼接
# mask_bit = []
# for i in mask_list:#小数点隔开的每一数字段
# i = bin(int(i))#每一数字段转换为每一段的二进制数字段
# i = i[2:] #从每一段的二进制数字段的第三个数开始,因为前面有两个ob
# mask_bit.append(i.zfill(8)) #.zfill:返回指定长度的字符串,原字符串右对齐,前面填充0
# whole_mask = ''.join(mask_bit)
# # print(whole_mask)
# whole0_find = whole_mask.find("0")#查0从哪里开始
# whole1_rfind = whole_mask.rfind("1")#查1在哪里结束
# if whole1_rfind+1 == whole0_find:#两者位置差1位为正确
# #判断掩码是否正确
# return True
# else:
# return False
# # 判断是否是私有
# def check_private_ip(ip:str):
# # 三类私网
# ip_list = ip.split('.')
# if ip_list[0] == '10': return True
# if ip_list[0] == '172' and 16<=int(ip_list[1])<=31: return True
# if ip_list[0] == '192' and ip_list[1] == '168': return True
# return False
# ipClass2num = {
# 'A':0,
# 'B':0,
# 'C':0,
# 'D':0,
# 'E':0,
# 'ERROR':0,
# 'PRIVATE':0,
# }
# # 私有IP地址和A,B,C,D,E类地址是不冲突的,也就是说需要同时+1
# while True:
# try:
# s = input() # 输入
# ip = s.split('~')[0] # ip
# mask = s.split('~')[1] # mask
# if check_ip(ip): # 如果没有错误
# first = int(ip.split('.')[0]) # 第一位
# if first==127 or first==0: # 如果是0或者127 不属于任意类,continue
# # 若不这样写,当类似于【0.*.*.*】和【127.*.*.*】的IP地址的子网掩码错误时,会额外计数
# continue
# if check_mask(mask): # 如果掩码也没有问题
# if check_private_ip(ip): # 如果是私有的
# ipClass2num['PRIVATE'] += 1
# if 0<first<127:
# ipClass2num['A'] += 1
# elif 127<first<=191:
# ipClass2num['B'] += 1
# elif 192<=first<=223:
# ipClass2num['C'] += 1
# elif 224<=first<=239:
# ipClass2num['D'] += 1
# elif 240<=first<=255:
# ipClass2num['E'] += 1
# else:
# ipClass2num['ERROR'] += 1
# else:
# ipClass2num['ERROR'] += 1
# except:
# break
# for v in ipClass2num.values():
# print(v,end=(' '))
