按位与+掩码判断 | HJ39 判断两个IP是否属于同一子网

# 最优解
while 1:
    try:
        mask = list(map(int, input().split('.')))
        ip1 = list(map(int, input().split('.')))
        ip2 = list(map(int, input().split('.')))
        f = True
        for i in range(len(mask)):
            if mask[i] not in range(256) or ip1[i] not in range(256) or ip2[i] not in range(256):
                f = False
                break
            if i<len(mask)-1 and mask[i] < mask[i+1]:
                f = False
                break
        t1,t2= [],[]
        if f:
            for i in range(len(mask)):
                t1.append(mask[i]&ip1[i])
                t2.append(mask[i]&ip2[i])
            if t1==t2:
                print(0)
            else: print(2)
        else: print(1)       
    except:break

# 我的代码
def is_ip_valid(ip):
    for seg in ip:
        if int(seg) < 0 or int(seg) > 255:
            return False
    return True

def is_mask_valid(mask):
    if not is_ip_valid(mask):
        return False
    bin_mask = ''
    for seg in mask:
        bin_seg = '{:0>8}'.format(bin(int(seg))[2:])
        bin_mask += bin_seg
    for i in range(1, 33):
        tmp = bin_mask[i:]
        if bin_mask[i]=='0':
            return int(tmp) == 0

def mask_ip(ip, maks):
    res = []
    for ip_seg, mask_seg in zip(ip, mask):
        res.append(str(int(ip_seg) & int(mask_seg)))
    return '.'.join(res)

while True:
    try:
        mask = input().split('.')
        ip1 = input().split('.')
        ip2 = input().split('.')
        if not is_ip_valid(ip1) or not is_ip_valid(ip2) or not is_mask_valid(mask):
            print(1)
        else:
            res1 = mask_ip(ip1, mask)
            res2 = mask_ip(ip2, mask)
            if res1 == res2:
                print(0)
            else:
                print(2)
    except:
        break

要点:

1、两个ip同属子网判断:int数值按位与&

2、子网掩码合法判断:出现后项大于前项为非法(二进制,不是十进制);寻找二进制掩码最后一个“1”和首个“0”索引之差,为1合法

华为笔试刷题 文章被收录于专栏

高质量题: 1~40:HJ16,HJ22,HJ24,HJ26,HJ27,HJ28,HJ35,HJ37,HJ39; 40~80:HJ41,HJ42,HJ43,HJ44,HJ48,HJ50,HJ52,HJ53,HJ57,HJ61,HJ63,HJ64,HJ70,HJ71,HJ74,HJ77; 80~108:HJ82,HJ85,HJ88,HJ89,HJ93,HJ95,HJ98,HJ103,HJ107

全部评论

相关推荐

06-20 19:40
中原工学院 Java
网络存储:十几天不会让你拉人办卡就结束了吧?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务