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

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

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

import sys



def check_mask(mask):
    # 不能是0.0.0.0 或者 255.255.255.255
    if mask.count('0') == 4 or mask.count('255') == 4:
        return False
    # 不能小于0 或 大于255
    for i in mask:
        if int(i) < 0 or int(i) > 255:
            return False
    # 不能有不连续的1 或者 0    (不行:111001, 可以:111000)
    s = ''
    for i in mask:
        s += bin(int(i))[2:].zfill(8)
    index_0 = s.index('0')      #.index('0') 返回第一次出现‘0’的index
    if len(s[:index_0]) != s[:index_0].count('1'):      #一堆1不带0
        return False
    if len(s[index_0:]) != s[index_0:].count('0'):      #一堆0不带1
        return False
    return True

def check_ip(ip):
    if '' in ip:    # 192..224.255
        return False
    if len(ip) != 4:    # 192.224.225
        return False
    for i in ip:    #范围 2-255
        if int(i) < 0 or int(i) > 255:
            return False
    return True

def binary(l):  # 返回列表的二进制结果
    s = ''
    for i in l:
        s += bin(int(i))[2:].zfill(8)
    return s

def check_same(s_mask, s_ip1, s_ip2):     # 检查是否在同一子网
    for i in range(32):
        if (int(s_mask[i]) and int(s_ip1[i])) != (int(s_mask[i]) and int(s_ip2[i])):
            return False
    return True

while 1:
    try:
        mask = input().split('.')
        ip1 = input().split('.')
        ip2 = input().split('.')
        if check_mask(mask) and check_ip(ip1) and check_ip(ip2):
            str_mask = binary(mask)
            str_ip1 = binary(ip1)
            str_ip2 = binary(ip2)
            if check_same(str_mask,str_ip1,str_ip2):
                print(0)    #相同
            else:
                print(2)    #不同
        else:
            print(1)    #非法
    except:
        break

全部评论

相关推荐

03-02 17:52
已编辑
北京航空航天大学 Java
狠狠学代码:布什哥们,这科研经历真来互联网卷Java啊,真干两年找不到工作咋整,这科研成果读个博去高校不好吗这实力太强了
点赞 评论 收藏
分享
永不遗忘:才这么点算什么拉黑,我初筛连着挂几十次了,最后还是能进面
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务