题解 | #识别有效的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=' ')
全部评论

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务