题解 | #识别有效的IP地址和掩码并进行分类统计#

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

难度不大,但是需要把题目看清楚,尤其题目例子和条件,一个都不能漏,如果不看清楚题目就开始写,就会漏掉很多情况。
本体难度在于掩码判断,个人觉得这个比较难想到用左移运算,想到这个就很简单了。
思路:
1.第一步:首先得判断IP是否合法,如果不合法,直接得出结果,不用继续判断。
2.第二步:IP合法,再判断子网掩码是否合法,如果子网掩码不合法,直接得出结果,不用继续判断。
3.第三步:子网掩码合法,再判断IP类型以及是否是私有地址。
import re
a,b,c,d,e,er,p,t = 0,0,0,0,0,0,0,0
try:
    while True:
        err = 0
        ip,mask = input().strip().split('~')
        sub_ip = ip.split('.')
        #总体判断是否合法IP:
        for i in sub_ip:
            if not i.isdigit() or int(i)<0 or int(i)>255:
                err = err + 1
                er = er + 1
                break
        #总体IP没有错
        if err == 0 and sub_ip[0] != '0' and sub_ip[0] != '127':
            #再判断子网掩码
            sub_mask = mask.split('.')
            tmp = bin((int(sub_mask[0])<<24) + (int(sub_mask[1])<<16) + (int(sub_mask[2])<<8) + int(sub_mask[3]))
            tmp = tmp[2:]
            if tmp.find('1') == -1 :
                err = err +1
                er = er + 1
            elif tmp.find('0') == -1 :
                err = err +1
                er = er + 1
            else:
                if '1' in tmp[tmp.index('0'):]:
                    err = err +1
                    er = er + 1
           #子网掩码没有错,继续判断类型
            if err == 0:
                #判断A类地址
                if  1 <=int(sub_ip[0])<= 126:
                    if sub_ip[0] == '10':
                        p = p +1
                    a = a+1
                #判断B类地址
                if  128 <=int(sub_ip[0])<= 191:
                    if sub_ip[0] == '172' and 16<=int(sub_ip[1])<=31:
                        p = p +1
                    b = b+1
                #判断C类地址
                if  192 <=int(sub_ip[0])<= 223:
                    if sub_ip[0] == '192' and sub_ip[1] == '168':
                        p = p +1
                    c = c+1
                #判断D类地址
                if  224 <=int(sub_ip[0])<= 239:
                    d = d+1     
                #判断E类地址
                if  240 <=int(sub_ip[0])<= 255:
                    e = e+1
    
except:
    pass
print('{} {} {} {} {} {} {}'.format(a,b,c,d,e,er,p))


全部评论

相关推荐

10-10 17:54
点赞 评论 收藏
分享
jack_miller:杜:你不用我那你就用我的美赞臣
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务