牛客网-华为机考-HJ18-识别有效的IP地址和掩码并进行分类统计
2022/5/4 6:23:52
本文主要是介绍牛客网-华为机考-HJ18-识别有效的IP地址和掩码并进行分类统计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
// 识别有效的IP地址和掩码并进行分类统计 // https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682 #include <iostream> #include <string> #include <algorithm> #include <bitset> #include <vector> #include <sstream> using namespace std; enum IPAddressType { ERROR_IP = -1, A_IP, B_IP, C_IP, D_IP, E_IP, OTHERS_IP }; struct IPAndMaskResult { IPAddressType ipType {ERROR_IP}; bool isPrivateIP {}; bool isValidMask {}; }; struct IPAndMaskValidNum { int A_IP_Num {}; int B_IP_Num {}; int C_IP_Num {}; int D_IP_Num {}; int E_IP_Num {}; int ERR_IP_Num {}; int ERR_Mask_Num {}; int Private_IP_Num {}; }; // 子网掩码要求为3点分制格式 bool IsValidMask(const string mask) { stringstream ss(mask); string tmp {}; string bitStr {}; bool isValidMask = true; while (getline(ss, tmp, '.')) { bitset<8> b((int)stoi(tmp)); bitStr += b.to_string(); } auto iter = bitStr.find('1'); if (iter != bitStr.npos) { bitStr = bitStr.substr(iter); } if (bitStr.find("10") == bitStr.npos || bitStr.find("01") != bitStr.npos ) { isValidMask = false; } // cout <<"inMask:" << mask <<" bitStr:" <<bitStr <<" isValid:" <<isValidMask <<endl; return isValidMask; } IPAndMaskResult CheckIPAddrType(const string IP) { IPAndMaskResult ipAndMaskRes {}; const int ipLen = 4; stringstream ss(IP); string tmp {}; int ipNum[ipLen] {}; int index = 0; while (getline(ss, tmp, '.')) { if (tmp.size() == 0 || stoi(tmp) > 255) { ipAndMaskRes.ipType = ERROR_IP; return ipAndMaskRes; // valid ip quit directly } ipNum[index++] = stoi(tmp); } if (ipNum[0] == 0 || ipNum[0] == 127) { ipAndMaskRes.ipType = OTHERS_IP; return ipAndMaskRes; } if ((ipNum[0] == 10) || (ipNum[0] == 172 && ipNum[1] >= 16 && ipNum[1] <= 31) || (ipNum[0] == 192 && ipNum[1] == 168)) { ipAndMaskRes.isPrivateIP = true; } if (ipNum[0] >= 1 && ipNum[0] <= 126) { ipAndMaskRes.ipType = A_IP; } else if (ipNum[0] >= 128 && ipNum[0] <= 191) { ipAndMaskRes.ipType = B_IP; } else if (ipNum[0] >= 192 && ipNum[0] <= 223) { ipAndMaskRes.ipType = C_IP; } else if (ipNum[0] >= 224 && ipNum[0] <= 239) { ipAndMaskRes.ipType = D_IP; } else if (ipNum[0] >= 240 && ipNum[0] <= 255) { ipAndMaskRes.ipType = E_IP; } else { ipAndMaskRes.ipType = ERROR_IP; } return ipAndMaskRes; } IPAndMaskResult Solution(const string IPAndMask) { IPAndMaskResult ipAndMaskRes {}; string ip {}; string mask {}; string tmp = IPAndMask; auto iter = IPAndMask.find('~'); if (iter != IPAndMask.npos) { ip = IPAndMask.substr(0, iter); if (iter+1 < IPAndMask.size()) { mask = IPAndMask.substr(iter+1); } } ipAndMaskRes = CheckIPAddrType(ip); ipAndMaskRes.isValidMask = IsValidMask(mask); return ipAndMaskRes; } int main() { IPAndMaskValidNum ipAndMaskValidNum {}; IPAndMaskResult ipAndMaskRes {}; string IPAndMask {}; while (getline(cin, IPAndMask)) { ipAndMaskRes = Solution(IPAndMask); if (ipAndMaskRes.ipType == OTHERS_IP) { continue; } if (!ipAndMaskRes.isValidMask) { ipAndMaskValidNum.ERR_Mask_Num ++; continue; } switch (ipAndMaskRes.ipType) { case ERROR_IP: ipAndMaskValidNum.ERR_IP_Num ++; break; case A_IP: ipAndMaskValidNum.A_IP_Num ++; break; case B_IP: ipAndMaskValidNum.B_IP_Num ++; break; case C_IP: ipAndMaskValidNum.C_IP_Num ++; break; case D_IP: ipAndMaskValidNum.D_IP_Num ++; break; case E_IP: ipAndMaskValidNum.E_IP_Num ++; break; default: break; } if (ipAndMaskRes.isPrivateIP) { ipAndMaskValidNum.Private_IP_Num ++; } } cout << ipAndMaskValidNum.A_IP_Num << " " << ipAndMaskValidNum.B_IP_Num << " " << ipAndMaskValidNum.C_IP_Num << " " << ipAndMaskValidNum.D_IP_Num << " " << ipAndMaskValidNum.E_IP_Num << " " << ipAndMaskValidNum.ERR_IP_Num + ipAndMaskValidNum.ERR_Mask_Num << " " << ipAndMaskValidNum.Private_IP_Num <<endl; return 0; }
这篇关于牛客网-华为机考-HJ18-识别有效的IP地址和掩码并进行分类统计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-20测试人员都是画画大神,让我看看谁还不会用代码图?
- 2024-05-20年薪百万的程序员都在用的摸鱼方式……
- 2024-05-19永别了,微服务架构!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了