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

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442870次浏览 4513人参与
# 春招别灰心,我们一人来一句鼓励 #
42047次浏览 534人参与
# 阿里云管培生offer #
120339次浏览 2220人参与
# 地方国企笔面经互助 #
7969次浏览 18人参与
# 同bg的你秋招战况如何? #
76925次浏览 565人参与
# 实习必须要去大厂吗? #
55786次浏览 961人参与
# 北方华创开奖 #
107453次浏览 600人参与
# 虾皮求职进展汇总 #
115973次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11632次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2454828次浏览 34858人参与
# 提前批简历挂麻了怎么办 #
149917次浏览 1978人参与
# 在找工作求抱抱 #
906063次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4760次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1195992次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157640次浏览 2267人参与
# 双非本科求职如何逆袭 #
662310次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12786次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35857次浏览 384人参与
# 简历中的项目经历要怎么写? #
86928次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20142次浏览 240人参与
# 我的上岸简历长这样 #
452040次浏览 8089人参与
牛客网
牛客企业服务