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

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

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

'''
所有的IP地址划分为 A,B,C,D,E五类
A类地址从1.0.0.0到126.255.255.255;
B类地址从128.0.0.0到191.255.255.255;
C类地址从192.0.0.0到223.255.255.255;
D类地址从224.0.0.0到239.255.255.255;
E类地址从240.0.0.0到255.255.255.255

私网IP范围是:
从10.0.0.0到10.255.255.255
从172.16.0.0到172.31.255.255
从192.168.0.0到192.168.255.255

子网掩码为二进制下前面是连续的1,然后全是0。
意为:前面都是255,后面都是0
'''

# ip、mask 是否均合法
def iflegal_ip(ip):  # 列表形式
    
    if len(ip)!=4:
        return False
    else:
        for i in ip:
            if (
                i.isdigit()==0
                or i==''  # i 是空值
                or int(i)>255
                or int(i)<0
                or (i[0]==0 and len(i)>1)
            ):
                return False
                break
        else:
            return True

def iflegal_mask(mask):

    if not iflegal_ip(mask): 
        # 不满足合法ip的要求,mask必定不合法
        return False
    #if len(mask)!=4:
        #return False
    if mask==[0,0,0,0] or mask==[255,255,255,255]:
        return False
    #legal_mask=[[255,0,0,0],[255,255,0,0],[255,255,255,0]]
    # 子网掩码不仅有上面3个,需要判断1和0交接的位置(1的结束位置、0的起始位置)
    mask_bin=[]  # 存放二进制掩码
    for i in mask:
        j=bin(int(i))
        j=j[2:] #转二进制后,前俩位置是0b
        mask_bin.append(j.zfill(8)) 
        # .zfill:返回指定长度的字符串,原字符串右对齐,前面填充0
    full_mask=''.join(mask_bin)
    full1_find=full_mask.rfind('1')  # 1的结束位置
    full0_find=full_mask.find('0')   # 0的起始位置
    if full1_find+1==full0_find:
        return True
    else:
        return False


a=0
b=0
c=0
d=0
e=0
wrong=0
personal=0

while 1:
    try:
        s=input().split('~')
        ip,mask=s[0].split('.'),s[1].split('.')
        #print(ip,iflegal_ip(ip),mask,iflegal_mask(mask))
        if int(ip[0])==0 or int(ip[0])==127:
            continue
        if iflegal_ip(ip) and iflegal_mask(mask):
            # 若ip或mask非法
            if 1<=int(ip[0])<=126:
                a += 1
                if int(ip[0])==10:
                    personal += 1
            elif 128<=int(ip[0])<=191:
                b += 1
                if int(ip[0])==172 and 16<=int(ip[1])<=31:
                    personal += 1
            elif 192<=int(ip[0])<=223:
                c += 1
                if int(ip[0])==192 and int(ip[1])==168:
                    personal += 1
            elif 224<=int(ip[0])<=239:
                d += 1
            elif 240<=int(ip[0])<=255:
                e += 1
            elif int(ip[0])==0 or int(ip[0])==127:  # 0 127 忽略
                continue           
        else:
            wrong += 1
    
    except:
        break

print(a,end=' ')
print(b,end=' ')
print(c,end=' ')
print(d,end=' ')
print(e,end=' ')
print(wrong,end=' ')
print(personal,end=' ')
'''
s='11000111111000001'
print(s.find('1'),s.find('0')) #起始位置
print(s.rfind('1'),s.rfind('0')) # 结束位置
'''


全部评论

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务