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

相关推荐

丿南烟丶:黑白模板吧,不要这样花哨的。 主要成就太空了,和获奖融在一起,写一两行就行了。 职业技能不要这样排,就传统的掌握精通什么什么然后举例补充的一些重要技术点。 自我介绍说实话也没啥用,可以删了。 把自己的两个项目方案细节补充上去,为什么这样设计,怎么设计,成果是什么按star法则来写 你要引导面试官来问你的技能和项目,你的获奖和自我介绍别人可能看都不看一眼或者不太在乎,重要的是展示你能干活的能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务