题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
解题思路: 1.判断IP是否合法:首先要判断IP是否为数字,isdigit()函数可以判断输入的是否为数字字符串,如果是则返回True,再判断是否为4段的IP,再判断每一段是否都在0~255之间,注意边界值:IP的边界值为0和255 2.判断mask是否合法:同IP一样先判断是否为数字,再判断是否为4段,最后将其转换为二进制数,判断是否为前面1后面0 3.区分IP的各个类别,根据值来划分即可 4.统计各个段的个数。 以上为整体思路,其中要特别注意的是range函数是针对的int等数字而不是字符串。刚开始直接判断的字符串导致一直报错。其中的难点还是在判断子网掩码和IP是否合法。
def check_ip(ip):
if len(ip)!=4:
return False
for i in ip:
if i not in range(0,256):
return False
return True
def check_mask(mask):
if len(mask) !=4:
return False
res=''
for i in mask:
temp=bin(i).replace('0b','')
res+=(8-len(temp))*'0'+temp
if '01' in res or '1' not in res or '0' not in res:
return False
return True
def get_list(s):
list=[]
for i in s.split('.'):
if i.isdigit():
list.append(int(i))
return list
def get_private(ip):
if ip[0]==10 or (ip[0]==172 and ip[1] in range(16,32)) or (ip[0]==192 and ip[1]==168):
return 'private'
return False
def get_type(ip):
if ip[0] in range(1,127):
return 'A'
elif ip[0] in range(128,192):
return 'B'
elif ip[0] in range(192,224):
return 'C'
elif ip[0] in range(224,240):
return 'D'
elif ip[0] in range(240,256):
return 'E'
if __name__=='__main__':
dic_count={'A':0,'B':0,'C':0,'D':0,'E':0,'error':0,'private':0}
while True:
try:
ip0,mask0 =input().split('~')
ip,mask=get_list(ip0),get_list(mask0)
if ip[0] in [0,127]:
continue
if not check_mask(mask):
dic_count['error']+=1
continue
if not check_ip(ip):
dic_count['error']+=1
continue
if get_private(ip) == 'private':
dic_count['private']+=1
if get_type(ip)=='A':
dic_count['A']+=1
elif get_type(ip)=='B':
dic_count['B']+=1
elif get_type(ip)=='C':
dic_count['C']+=1
elif get_type(ip)=='D':
dic_count['D']+=1
elif get_type(ip)=='E':
dic_count['E']+=1
except:
break
for i in dic_count.values():
print(i,end=' ')