题解 | #识别有效的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')) # 结束位置
'''


全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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