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

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

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

ipClass2num = {
    'A':0,
    'B':0,
    'C':0,
    'D':0,
    'E':0,
    'ERROR':0,
    'PRIVATE':0,
}
# 私有IP地址和A,B,C,D,E类地址是不冲突的,也就是说需要同时+1
def check_ip(ip:str):
    ip_bit = ip.split('.')
    if len(ip_bit) != 4 or '' in ip_bit:  #ip 的长度为4 且每一位不为空
        return False
    for i in ip_bit:
        if int(i)<0 or int(i) >255:   #检查Ip每一个10位的值范围为0~255
            return False
    return True
def check_mask(mask:str):
    if not check_ip(mask):
        return False
    if mask == '255.255.255.255' or mask == '0.0.0.0':
        return False
    mask_list = mask.split('.')
    if len(mask_list) != 4:
        return False
    mask_bit = []
    for i in mask_list:#小数点隔开的每一数字段
        i = bin(int(i))#每一数字段转换为每一段的二进制数字段
        i = i[2:] #从每一段的二进制数字段的第三个数开始,因为前面有两个ob
        mask_bit.append(i.zfill(8)) #.zfill:返回指定长度的字符串,原字符串右对齐,前面填充0
    whole_mask = ''.join(mask_bit)
#     print(whole_mask)
    whole0_find = whole_mask.find("0")#查0从哪里开始
    whole1_rfind = whole_mask.rfind("1")#查1在哪里结束                   
    if whole1_rfind+1 == whole0_find:#两者位置差1位为正确
        return True
    else:
        return False
def check_private_ip(ip:str):
    # 三类私网
    ip_list = ip.split('.')
    if ip_list[0] == '10': return True
    if ip_list[0] == '172' and 16<=int(ip_list[1])<=31: return True
    if ip_list[0] == '192' and ip_list[1] == '168': return True
    return False
while True:
    try:
        s = input()
        ip = s.split('~')[0]
        mask = s.split('~')[1]
        if check_ip(ip):
            first = int(ip.split('.')[0])
            if first==127 or first==0:
                # 若不这样写,当类似于【0.*.*.*】和【127.*.*.*】的IP地址的子网掩码错误时,会额外计数
                continue
            if check_mask(mask):
                if check_private_ip(ip):
                    ipClass2num['PRIVATE'] += 1
                if 0<first<127: 
                    ipClass2num['A'] += 1
                elif 127<first<=191:
                    ipClass2num['B'] += 1
                elif 192<=first<=223:
                    ipClass2num['C'] += 1
                elif 224<=first<=239:
                    ipClass2num['D'] += 1
                elif 240<=first<=255:
                    ipClass2num['E'] += 1
            else:
                ipClass2num['ERROR'] += 1
        else:
            ipClass2num['ERROR'] += 1
    except:
        break
for v in ipClass2num.values():
    print(v,end=(' '))
全部评论
第22行应该要加换行符\n吧? if mask == '255.255.255.255\n' or mask == '0.0.0.0\n':
2 回复 分享
发布于 2022-07-26 09:10
这题有问题 应该先输入个数 在输入对应个数的IP~MASK
1 回复 分享
发布于 2022-05-04 15:17
192.168.yy.10~255.255.255.0 这样的非法字符串输入,check_ip里面用int会产生异常,可以这样 try: ip = list(map(int, addr)) exception: error += 1 return False
1 回复 分享
发布于 2023-03-09 22:55 湖北
127.201.56.50~255.255.111.255这个用例,你的代码输出0 0 0 0 0 0 0 ,显然是不对的。
1 回复 分享
发布于 02-28 22:25 浙江
可以问一下为什么 check_mask 里面还需要有这句吗? def check_mask(mask:str): if not check_ip(mask): # 为什么有这句? return False
点赞 回复 分享
发布于 2022-03-14 17:51
为什么255.255.255.255要返回False?
点赞 回复 分享
发布于 2022-03-28 10:52
多行输入是怎么解决的?
点赞 回复 分享
发布于 2022-04-10 16:17
('6.72.161.12', '255.252.0.0') 问一下,这个ip为啥算是a类的,我和标准答案比对了,才找出来这个东西,浪费了我一个通宵,我理解252不是255,应该是子网掩码问题,应该算是错误的啊,求解惑,不胜感激。
点赞 回复 分享
发布于 2022-05-18 12:57
我想问的是假设子网掩码如(128.128.128.128),其中128二进制下为10000000,依据题意“子网掩码为二进制下前面是连续的1,然后全是0”,是不是非法的,因为1并不连续,代码中好像没排除这种情况
点赞 回复 分享
发布于 2022-05-31 18:23
如何实现多行输入
点赞 回复 分享
发布于 2022-07-01 10:35
为什么要先判断mask然后再判断IP呢?两个不是独立的吗?多谢
点赞 回复 分享
发布于 2022-08-23 11:24 香港
if '01' in whole_mask: return False line34-line39为啥我上面这样不能
点赞 回复 分享
发布于 2023-02-13 16:19 浙江
你好,感谢你分享的方法。下面稍微简化了一下代码 import sys def ip(listb): if len(listb) !=4 or '' in listb: return False; for i in listb: if int(i)<0 or int(i)>255: return False return True def mask(listc): j='' if len(listc) != 4: return False; for i in listc: j += f"{bin(int(i))[2:]:>08}" #返回指定长度的字符串,原字符串右对齐,前面填充0 if j.find("0")-j.rfind("1")==1: return True; else: return False; def private_ip(listb): if int(listb[0]) == 10 : return True; if int(listb[0]) == 127 and 16<=int(listb[1])<=31 : return True; if int(listb[0]) == 192 and int(listb[1]) == 168: return True; dit = {"A":0,"B":0,"C":0,"D":0,"E":0,"ERROR":0,"PRIVATE":0} for line in sys.stdin: a = line.split("\n")[0].split("~") b = a[0].split(".") c = a[1].split(".") if ip(b): if int(b[0]) == 127 or int(b[0])==0: continue; if mask(c): if private_ip(b): dit["PRIVATE"]+=1; if 0< int(b[0]) <127: dit["A"] += 1 elif 127
点赞 回复 分享
发布于 2023-08-01 17:41 广东
想请问一下为什么还要有if len(mask_list) != 4:这个语句呢,前面 if not check_ip(mask): return False这里不是已经把它筛选掉了吗,这样不是重复写了吗,谢谢
点赞 回复 分享
发布于 01-03 22:56 浙江
想请问一下定义函数的时候为什么要def check_ip(ip:str)加str呢,可以直接这样def check_ip(ip)吗?
点赞 回复 分享
发布于 01-05 20:47 浙江
255.255.111.255这不是合法掩码吧,你的代码判断它是
点赞 回复 分享
发布于 02-27 00:53 云南

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
66 10 评论
分享
牛客网
牛客企业服务