华为机试:识别有效的IP地址和子网掩码并进行分类

华为机试:识别有效的IP地址和子网掩码并进行分类:100行代码解决

题目可以参见牛客网:https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682?tpId=37&tqId=21241&rp=0&ru=/ta/huawei&qru=/ta/huawei/question-ranking

这题其实不算难,但要考虑到的因素有点多,一旦漏了很难找错。
题目描述
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为 A,B,C,D,E五类 A类地址
1.0.0.0~126.255.255.255;
B类地址128.0.0.0~191.255.255.255;
C类地址192.0.0.0~223.255.255.255;
D类地址224.0.0.0~239.255.255.255;
E类地址240.0.0.0~255.255.255.255 ;

私网IP范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码) 注意二进制下全是1或者全是0均为非法
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
1 0 1 0 0 2 1

分析:
拿到题目,需要注意以下几点
(1)0.0.0.0和255.255.255.255 为非法子网掩码(题目的意思)
(2)当子网掩码错误时,不再判断ip是否有效,错误直接加一, ip地址不属于ABCDE或私网的任何一类
(3)当一个ip属于ABCDE类中的一个时候,也属于私有ip时,私有ip和他属于的分类都应该加一

解题的方法:
(1)首先,可以把 ‘~’ 前后的字符串拆开到两个string类型的数组里,每个数组分别放ip和子网掩码;
(2)把用 '.'隔开的数字放到数组里,如果数组长度小于4(如19..0.1),则ip地址非法;如果数组中的数字小于0或者大于255,同样无效;
(3)判断子网掩码时,二进制下前面是连续的1,然后全是0。可以用1从高位到低位与地址按位与,设置一个标志flag。如果出现了0,flag变为0,此时后面再出现1的话,则错误。

#include<bits/stdc++.h>
using namespace std;
//将一串ip地址转化为一个int型数组,数组低位放ip地址高位
//如255.255.255.64,数组里是255,255,255,64
vector<int> StoVec(string s) {
   
    vector<int> res;
    string temp = "";
    for (int i = 0; i < s.size(); i++) {
   
        if (s[i] != '.')
            temp += s[i];
        if (s[i] == '.' || i == s.size() - 1) {
   //到了最后一部分,没有'.'
            int num;
            try {
   //如果出现两个'.'连续,则temp为空,需要捕获异常
                num = stoi(temp);
            }
            catch (std
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值