华为OD机试真题 新系统 C++&Java实现【IP地址分类识别】
华为OD机试新系统真题目录包含(C/C++/Py/Java/Js/Go)题解点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解
题目描述
- R类(保留地址): 0.0.0.0 0.0.0.0 0.0.0.0 ~ 0.255.255.255 0.255.255.255 0.255.255.255
- A类: 1.0.0.0 1.0.0.0 1.0.0.0 ~ 126.255.255.255 126.255.255.255 126.255.255.255
- L L L类(环回地址): 127.0.0.0 127.0.0.0 127.0.0.0 ~ 127.255.255.255 127.255.255.255 127.255.255.255
- B B B类: 128.0.0.0 128.0.0.0 128.0.0.0 ~ 191.255.255.255 191.255.255.255 191.255.255.255
- C C C类: 192.0.0.0 192.0.0.0 192.0.0.0 ~ 223.255.255.255 223.255.255.255 223.255.255.255
- D D D类(组播地址): 224.0.0.0 224.0.0.0 224.0.0.0 ~ 239.255.255.255 239.255.255.255 239.255.255.255
- E E E类(保留地址): 240.0.0.0 240.0.0.0 240.0.0.0 ~ 255.255.255.255 255.255.255.255 255.255.255.255
实现一个函数,输入一个IPv4地址,判断是哪一类IP地址,输出对应的类型:“ A A A”、“ B B B”、“ C C C”…;如果输入的IP地址不符合规范,则输出" F F F"。
IP地址合法性判定规则:
- IP地址由 4 4 4个整数组成,取值范围为 0 0 0 ~ 255 255 255
.作为分割符分隔 4 4 4个数字
补充说明
题目中出现的数字,除了数字" 0 0 0"以外,不存在其他数字存在前导 0 0 0的情况,比如不会存在" 05 05 05"、" 010 010 010"等。
输入描述
输入一个IPV4地址
输出描述
输出对应的类型,如果输入IP地址不合法,输出F
样例1
输入
126.255.255.255
输出
A
说明
A A A类: 1.0.0.0 1.0.0.0 1.0.0.0 ~ 126.255.255.255 126.255.255.255 126.255.255.255
样例2
输入
191.255.255.255
输出
B
说明
B B B类: 128.0.0.0 128.0.0.0 128.0.0.0 ~ 191.255.255.255 191.255.255.255 191.255.255.255
样例3
输入
223.255.255.255
输出
C
说明
C C C类: 192.0.0.0 192.0.0.0 192.0.0.0 ~ 223.255.255.255 223.255.255.255 223.255.255.255
样例4
输入
239.255.255.255
输出
F
说明
D D D类: 224.0.0.0 224.0.0.0 224.0.0.0 ~ 239.255.255.255 239.255.255.255 239.255.255.255(组播地址)
样例5
输入
255.255.255.255
输出
E
说明
E E E类: 240.0.0.0 240.0.0.0 240.0.0.0 ~ 255.255.255.255 255.255.255.255 255.255.255.255(保留地址)
样例6
输入
a.0.0.0
输出
F
说明
a非数字
样例7
输入
0.0.0.1
输出
R
说明
保留地址: 0.0.0.0 0.0.0.0 0.0.0.0 ~ 0.255.255.255 0.255.255.255 0.255.255.255
样例8
输入
127.0.0.1
输出
L
说明
环回地址: 127.0.0.0 127.0.0.0 127.0.0.0 ~ 127.255.255.255 127.255.255.255 127.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>
#include<iostream>
#include<vector>
#include<string>
#include <utility>
#include <sstream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
// 通用 切割函数 函数 将字符串str根据delimiter进行切割
vector<string> split(const string& str, const string& delimiter) {
vector<string> 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 (auto&c : str) {
if (!isdigit(c)) {
return false;
}
}
return true;
}
// 解析ip返回对应long值,不合法返回-1
long parseIp(string ip) {
vector<string> 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) {
// 映射出每个分类起始和结束范围
map<string, pair<long, 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代码实现
import java.util.*;
import java.io.*;
public class Main {
// 判断是否只包含数字字符
public static boolean judge(String str) {
for (char c : str.toCharArray()) {
if (!Character.isDigit(c)) {
return false;
}
}
return true;
}
// 解析ip返回对应long值,不合法返回-1
public static long parseIp(String ip) {
String[] ipPart = ip.split("\\.");
if (ipPart.length != 4) {
return -1;
}
long res = 0;
for (int i = 0; i < 4; i++) {
String cur = ipPart[i];
if (cur.isEmpty() || cur.length() > 3 || !judge(cur)) {
return -1;
}
long value = Long.parseLong(cur);
// 超过限制
if (value > 255) {
return -1;
}
res = (res << 8) + value;
}
return res;
}
public static String ipClassify(String ip) {
// 映射出每个分类起始和结束范围
Map<String, long[]> mp = new LinkedHashMap<>();
mp.put("R", new long[]{parseIp("0.0.0.0"), parseIp("0.255.255.255")});
mp.put("A", new long[]{parseIp("1.0.0.0"), parseIp("126.255.255.255")});
mp.put("L", new long[]{parseIp("127.0.0.0"), parseIp("127.255.255.255")});
mp.put("B", new long[]{parseIp("128.0.0.0"), parseIp("191.255.255.255")});
mp.put("C", new long[]{parseIp("192.0.0.0"), parseIp("223.255.255.255")});
mp.put("D", new long[]{parseIp("224.0.0.0"), parseIp("239.255.255.255")});
mp.put("E", new long[]{parseIp("240.0.0.0"), parseIp("255.255.255.255")});
long ipValue = parseIp(ip);
if (ipValue == -1) {
return "F";
}
// 判断所属类型
for (Map.Entry<String, long[]> entry : mp.entrySet()) {
String key = entry.getKey();
long[] range = entry.getValue();
if (range[0] <= ipValue && range[1] >= ipValue) {
return key;
}
}
return "F";
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String ip = br.readLine();
String res = ipClassify(ip);
System.out.println(res);
}
}
更多推荐


所有评论(0)