题解 | #判断两个IP是否属于同一子网#

判断两个IP是否属于同一子网

https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

import sys
def maskvalid(mask):   #判断掩码是否有效,有效=1,无效=0,输入为原始字符串
    mask = mask.split('.')  #按.拆分成4部分。题目限定为4部分,否则需要对部分的数量容错。
    if len([x for x in mask if int(x)>=0 and int(x)<=255]) != 4:  
	  #如果4部分数中有超出0-255的,返回0,直接退出
        return 0  
	  #不要写成res=0 return res,因为后边还要做判断,如果此处已经出错,而下一句转换不成功的话则可能出现意外错误。
    mask = ''.join(['{:0>8}'.format(bin(int(x))[2:]) for x in mask])  #各段拼接成8为二进制,再拼接
    if ('01' in mask) or ('0' not in mask) or (int(mask,2)==0):  
	  #如果掩码中有'01'或全为1或全为0,返回0直接退出
        return 0
    return 1  #没发现任何错误则返回1
def ipvalid(ip):  #判断ip是否有效,有效=1,无效=0,输入为原始字符串
    res = 1  #由于后续不需要操作ip,此处可以预置一个结果变量。
    ip = ip.split('.') #将ip按.拆分成4份
    if len([x for x in ip if int(x)>=0 and int(x)<=255]) != 4:  
	  #判断是否有超出0-255的部分,若有则返回0,否则返回1
        res = 0
    return res
def matchip(mask,ip): #匹配掩码和字符串函数,输入均为原始未分隔字符串
    mask = ''.join(['{:0>8}'.format(bin(int(x))[2:]) for x in mask.split('.')])
    ip = ''.join(['{:0>8}'.format(bin(int(x))[2:]) for x in ip.split('.')])
	#将掩码和ip均按.拆分后,各自转换并不全为4个8位二进制数
    res = '' #预置结果位空
    for i in range(4): #按位部分对掩码和ip进行与操作,而后拼接成结果。先拼接再比较亦可。
        res += str(int(mask[(8*i):(8*i+8)],2)&int(ip[(8*i):(8*i+8)],2))
    return res #返回结果。
def subnet(mask,ip1,ip2):  #比较ip是否在同一子网
    if all([maskvalid(mask),ipvalid(ip1),ipvalid(ip2)]) == False:
	  #如果掩码或ip1,ip2有任一非法,则直接报错,返回结果res=1
        res = 1
    else:
        matchip1 = matchip(mask,ip1) #匹配掩码和ip1
        matchip2 = matchip(mask,ip2) #匹配掩码和ip2
        if matchip1 == matchip2:  #如果结果相同返回0,否则返回2
            res = 0
        else:
            res = 2
    return res
res = []
for i in range(1):
    mask = input()
    ip1 = input()
    ip2 = input()
    res.append(subnet(mask,ip1,ip2))
print(*(res),sep='\n')

全部评论

相关推荐

01-16 18:34
四川大学 Java
欢迎加入AI:没有啥稳定不稳定,一切都源于业务快速发展还是收缩。我当年一开始去的央企,业务不赚钱,也贼卷,慢慢就开始优化了。。。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-10 14:27
已编辑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务