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

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

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

# 分成3个函数1个正式检查 检查是否是正常的ip和mask 检查是否是正常掩码 检查是否是私有ip
def check_ip(ip:str):
    ip_bit = ip.split('.')
    if len(ip_bit)!=4 or "" in ip_bit:
        return False
    for i in ip_bit:
        if int(i)<0 or int(i)>255:
            return False
    return True

def check_mask(mask:str):
    if not check_ip(mask):  # 错误 调用函数,不用(mask:str)
        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:]
        mask_bit.append(i.zfill(8))
    whole_mask = ''.join(mask_bit)
    whole0_find = whole_mask.find("0")
    whole1_fine = whole_mask.rfind("1")
    if whole1_fine+1 == whole0_find:
        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

ipClass2num = {
    'A':0,
    'B':0,
    'C':0,
    'D':0,
    'E':0,
    'ERROR':0,
    'PRIVATE':0,
}
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:
                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=' ')




 
 

    







# # 检查ip 或者mask 如果有空值,非4位,小于或者大于255的统统都是错误ip,返回false
# 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

# # 掩码 是否 全部是111+000的形式 通过1的索引+1 = 0的所引 
# def check_mask(mask:str):
#     #如果有空值 非4位 小于0大于255 在这个函数也是返回false 
#     if not check_ip(mask):
#         return False
#     # 如果掩码 是开头 或者结尾 也是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
#     # 将掩码按照每个8位数拼接
#     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

# ipClass2num = {
#     'A':0,
#     'B':0,
#     'C':0,
#     'D':0,
#     'E':0,
#     'ERROR':0,
#     'PRIVATE':0,
# }
# # 私有IP地址和A,B,C,D,E类地址是不冲突的,也就是说需要同时+1
# while True:
#     try:
#         s = input() # 输入
#         ip = s.split('~')[0] # ip
#         mask = s.split('~')[1] # mask
#         if check_ip(ip): # 如果没有错误
#             first = int(ip.split('.')[0]) # 第一位
#             if first==127 or first==0: # 如果是0或者127 不属于任意类,continue
#                 # 若不这样写,当类似于【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=(' '))

全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量,&nbsp;mt=导师,&nbsp;ld=直属领导,&nbsp;cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld&nbsp;找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld&nbsp;的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc&nbsp;吗?”&nbsp;ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务