华为OD机试真题 新系统 C++Java实现【IP地址分类识别】 华为OD机试新系统真题目录包含(C/C/Py/Java/Js/Go)题解点击查看: 华为OD机试新系统真题题库目录机考题库 算法考点详解题目描述R类保留地址0.0.0.0 0.0.0.00.0.0.0~0.255.255.255 0.255.255.2550.255.255.255A类1.0.0.0 1.0.0.01.0.0.0~126.255.255.255 126.255.255.255126.255.255.255L LL类环回地址127.0.0.0 127.0.0.0127.0.0.0~127.255.255.255 127.255.255.255127.255.255.255B BB类128.0.0.0 128.0.0.0128.0.0.0~191.255.255.255 191.255.255.255191.255.255.255C CC类192.0.0.0 192.0.0.0192.0.0.0~223.255.255.255 223.255.255.255223.255.255.255D DD类组播地址224.0.0.0 224.0.0.0224.0.0.0~239.255.255.255 239.255.255.255239.255.255.255E EE类保留地址240.0.0.0 240.0.0.0240.0.0.0~255.255.255.255 255.255.255.255255.255.255.255实现一个函数输入一个IPv4地址判断是哪一类IP地址输出对应的类型“A AA”、“B BB”、“C CC”…如果输入的IP地址不符合规范则输出F FF。IP地址合法性判定规则IP地址由4 44个整数组成取值范围为0 00~255 255255.作为分割符分隔4 44个数字补充说明题目中出现的数字除了数字0 00以外不存在其他数字存在前导0 00的情况比如不会存在05 0505、010 010010等。输入描述输入一个IPV4地址输出描述输出对应的类型如果输入IP地址不合法输出F样例1输入126.255.255.255输出A说明A AA类1.0.0.0 1.0.0.01.0.0.0~126.255.255.255 126.255.255.255126.255.255.255样例2输入191.255.255.255输出B说明B BB类128.0.0.0 128.0.0.0128.0.0.0~191.255.255.255 191.255.255.255191.255.255.255样例3输入223.255.255.255输出C说明C CC类192.0.0.0 192.0.0.0192.0.0.0~223.255.255.255 223.255.255.255223.255.255.255样例4输入239.255.255.255输出F说明D DD类224.0.0.0 224.0.0.0224.0.0.0~239.255.255.255 239.255.255.255239.255.255.255组播地址样例5输入255.255.255.255输出E说明E EE类240.0.0.0 240.0.0.0240.0.0.0~255.255.255.255 255.255.255.255255.255.255.255保留地址样例6输入a.0.0.0输出F说明a非数字样例7输入0.0.0.1输出R说明保留地址0.0.0.0 0.0.0.00.0.0.0~0.255.255.255 0.255.255.2550.255.255.255样例8输入127.0.0.1输出L说明环回地址127.0.0.0 127.0.0.0127.0.0.0~127.255.255.255 127.255.255.255127.255.255.255题解思路思路模拟首先需要明确一个观点不同类型的IP地址本质是一个IP范围并且不同IP类型彼此不会发生重叠。预处理每种类型IPV4地址的起始和结束使用long类型存储不能使用int会发生溢出。IP 地址A.B.C.D转整数的公式为(A 24) (B 16) (C 8) D。解析要查询的IP地址首先判断是否是有效IPV4地址发生错误直接返回F主要考虑有以下几点是否由四部分组成每部分是否只包含数字字符并且非空是否超过0-255的范围解析出查询IP地址的ipValue,带入各个类型的区间range进行匹配range.begin ipValue range.second ipValue如果成立返回对应的类型即可。c代码实现#include cctype #includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorstring split(const string str, const string delimiter) { vectorstring result; size_t start 0; size_t end str.find(delimiter); while (end ! string::npos) { result.push_back(str.substr(start, end - start)); start end delimiter.length(); end str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } // 判断是否只包含数字字符 bool judge(string str) { for (autoc : str) { if (!isdigit(c)) { return false; } } return true; } // 解析ip返回对应long值不合法返回-1 long parseIp(string ip) { vectorstring ipPart split(ip, .); if (ipPart.size() ! 4) { return -1; } long res 0; for (int i 0; i 4; i) { string cur ipPart[i]; if (cur.empty() || cur.size() 3 || !judge(cur)) { return -1; } long value stol(cur); // 超过限制 if (value 255) { return -1; } res (res 8) value; } return res; } string ipClassify(string ip) { // 映射出每个分类起始和结束范围 mapstring, pairlong, long mp; mp[R] {parseIp(0.0.0.0), parseIp(0.255.255.255)}; mp[A] {parseIp(1.0.0.0), parseIp(126.255.255.255)}; mp[L] {parseIp(127.0.0.0), parseIp(127.255.255.255)}; mp[B] {parseIp(128.0.0.0), parseIp(191.255.255.255)}; mp[C] {parseIp(192.0.0.0), parseIp(223.255.255.255)}; mp[D] {parseIp(224.0.0.0), parseIp(239.255.255.255)}; mp[E] {parseIp(240.0.0.0), parseIp(255.255.255.255)}; long ipValue parseIp(ip); if (ipValue -1) { return F; } // 判断所属类型 for (auto [key, range] : mp) { if (range.first ipValue range.second ipValue) { return key; } } return F; } int main() { string ip; getline(cin, ip); string res ipClassify(ip); cout res; return 0; }JAVA代码实现importjava.util.*;importjava.io.*;publicclassMain{// 判断是否只包含数字字符publicstaticbooleanjudge(Stringstr){for(charc:str.toCharArray()){if(!Character.isDigit(c)){returnfalse;}}returntrue;}// 解析ip返回对应long值不合法返回-1publicstaticlongparseIp(Stringip){String[]ipPartip.split(\\.);if(ipPart.length!4){return-1;}longres0;for(inti0;i4;i){StringcuripPart[i];if(cur.isEmpty()||cur.length()3||!judge(cur)){return-1;}longvalueLong.parseLong(cur);// 超过限制if(value255){return-1;}res(res8)value;}returnres;}publicstaticStringipClassify(Stringip){// 映射出每个分类起始和结束范围MapString,long[]mpnewLinkedHashMap();mp.put(R,newlong[]{parseIp(0.0.0.0),parseIp(0.255.255.255)});mp.put(A,newlong[]{parseIp(1.0.0.0),parseIp(126.255.255.255)});mp.put(L,newlong[]{parseIp(127.0.0.0),parseIp(127.255.255.255)});mp.put(B,newlong[]{parseIp(128.0.0.0),parseIp(191.255.255.255)});mp.put(C,newlong[]{parseIp(192.0.0.0),parseIp(223.255.255.255)});mp.put(D,newlong[]{parseIp(224.0.0.0),parseIp(239.255.255.255)});mp.put(E,newlong[]{parseIp(240.0.0.0),parseIp(255.255.255.255)});longipValueparseIp(ip);if(ipValue-1){returnF;}// 判断所属类型for(Map.EntryString,long[]entry:mp.entrySet()){Stringkeyentry.getKey();long[]rangeentry.getValue();if(range[0]ipValuerange[1]ipValue){returnkey;}}returnF;}publicstaticvoidmain(String[]args)throwsException{BufferedReaderbrnewBufferedReader(newInputStreamReader(System.in));Stringipbr.readLine();StringresipClassify(ip);System.out.println(res);}}华为OD机试新系统真题 - IP地址分类识别(C/C/Py/Java/Js/Go)题解