题解 | 识别有效的IP地址和掩码并进行分类统计
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
import sys a,b,c,d,e,wrong,private = 0,0,0,0,0,0,0 ip_lists,subnet_mask_lists = [],[] for line in sys.stdin: ip,subnet_mask = line.strip().split("~") thistime_ip_list = ip.split(".") ip_lists.append(thistime_ip_list) thistime_sunnet_mask_list = subnet_mask.split(".") subnet_mask_lists.append(thistime_sunnet_mask_list) def check_binary_subnet(subnet_list): change_time = 0 if subnet_list[0] == 0: return False for i in range(1,len(subnet_list)): if subnet_list[i] != subnet_list[i-1]: change_time += 1 if change_time == 2: break if change_time == 0 or change_time == 2: return False else: return True for i in range(len(ip_lists)): # 获取输入列表 ip = ip_lists[i] subnet = subnet_mask_lists[i] # if len(ip) < 4 or len(subnet) < 4: # wrong += 1 # continue frist_ipnum = int(ip[0]) # if ip[0].isdigit(): # frist_ipnum = int(ip[0]) # else: # wrong += 1 # continue # 优先判断是不是特殊情况,如果是,直接跳过 if frist_ipnum == 0 or frist_ipnum == 127: continue # 判断正误,示例1里,子网掩码错了,IP也不算。所以一旦错了是一起的 is_wrong = False binary_subnet = [] for i in range(4): # 先处理ip地址 this_part_ip = ip[i] # if not this_part_ip.isdigit(): # is_wrong = True # break # else: num = int(ip[i]) if num<0 or num >=255: is_wrong = True break # 再看字码掩码 # if not subnet[i].isdigit(): # is_wrong = True # break # else: num = int(subnet[i]) binary_num = bin(num)[2:] binary_subnet.extend(binary_num.zfill(8)) if not check_binary_subnet(binary_subnet): is_wrong = True # 根据前面判断的正误来划分 if is_wrong: wrong += 1 else: if 1 <= frist_ipnum <=126: a+=1 if frist_ipnum == 10: private += 1 elif 128 <= frist_ipnum <= 191: b += 1 if frist_ipnum == 172 and 16 <= int(ip[1]) <= 31: private += 1 elif 192 <= frist_ipnum <= 223: c += 1 if frist_ipnum == 192 and int(ip[1]) == 168: private += 1 elif 224 <= frist_ipnum <= 239: d += 1 elif 240 <= frist_ipnum <= 255: e += 1 print(f"{a} {b} {c} {d} {e} {wrong} {private}")