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

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

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

# 判断mask是否合法, i.e.,换成2进制后, 最后一个1的位置在第一个0的前边
def validmask(mask):
    mask_str = ip2bin(mask)
    pos_1 = [i for i,v in enumerate(mask_str) if v == '1'][-1]
    pos_0 = [i for i,v in enumerate(mask_str) if v == '0'][0]
    return True if pos_0-pos_1 == 1 else False
    
# 把ip换成2进制
def ip2bin(ip):
    return ''.join([bin(k)[2::].zfill(8) for k in ip])

# 2进制"与"
def binadd(one, two):
    r = ''
    for i in range(len(one)):
        if one[i] == '1' and two[i] == '1':
            r+='1'
        else:
            r+='0'
    return r


def samesubnet(mask,ip_1,ip_2):
    mask = ip2bin(mask)
    ip_1 = ip2bin(ip_1)
    ip_2 = ip2bin(ip_2)
    
    if binadd(mask,ip_1) == binadd(mask,ip_2):
        return True
    else:
        return False
        
while True:
    try:
        mask = [int(k) for k in input().split('.') if 0<=int(k)<=255]
        ip_1 = [int(k) for k in input().split('.') if 0<=int(k)<=255]
        ip_2 = [int(k) for k in input().split('.') if 0<=int(k)<=255]

        if (len(mask) == 4 and len(ip_1) == 4 and len(ip_2) == 4) and validmask(mask):
            if samesubnet(mask,ip_1,ip_2):
                print(0)
            else:
                print(2)

        else:
            print(1)
    except:
        break

全部评论

相关推荐

三面的时候hr简单问了下期望薪资,感觉要少了,只要了15k,这种最后发offer的时候会按照最低薪资发吗?还是有谈薪的空间呢
尼克勒的风:不会,我要的时候要了15K。发的时候开的21K。不影响人家公司正常开的薪资范围。
点赞 评论 收藏
分享
offer飞来我手中:为啥现在看到大多数公司都有提前实习的要求
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务