题解 | #判断两个IP是否属于同一子网# python简易解法,31行搞定
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
问题1:子网掩码合法性判断?
分析子网掩码前面都是‘1’,后面都是‘0’,那么换言之就是‘1’和‘0’之间只有一个交界处数字从‘1’变为‘0’,所以只要找到第一个‘1’和‘0’交界处的‘1’的下标,然后判断它之前包含自身是否都是‘1’组成同时它之后全部是‘0’,如果符合那就是合法的,一旦不是那就非法
问题2:如何符合题意快速计算最后的十进制结果?
&运算符可以直接对两个int数进行位运算后转换回int,那么大大减少代码量
如有帮助请点赞哦~!~
def solve(mask, ip1, ip2): for x in ip1: if int(x) not in range(0, 256)&nbs***bsp;len(ip1)!=4: return 1 for x in ip2: if int(x) not in range(0, 256)&nbs***bsp;len(ip2)!=4: return 1 for x in mask: if int(x) not in range(0, 256)&nbs***bsp;len(mask)!=4: return 1 #ip数值和长度判断 mask_bin = ''.join(list(map(lambda x: bin(int(x))[2:].zfill(8), mask))) for i in range(len(mask_bin)): if mask_bin[i] == '1' and mask_bin[i + 1] == '0': if mask_bin[:i + 1] != '1' * (i + 1)&nbs***bsp;int(mask_bin[i + 1::]) != 0: return 1 #子网掩码合法性判断 l1 = [] l2 = [] for i in range(4): l1.append(int(bin(int(ip1[i]) & int(mask[i])), 2)) #十进制之间进行位运算 for i in range(4): l2.append(int(bin(int(ip2[i]) & int(mask[i])), 2)) if l1 == l2: #判断是否在同一子网 return 0 else: return 2 while True: try: mask,ip1,ip2 = input().split('.'),input().split('.'),input().split('.') print(solve(mask,ip1,ip2)) except: break