题目:找出n个IP中的黑名单IP

黑名单定义:给定了m个IP,mask采用CIDR表示,网段相同则判定为黑名单

example:

illegal_ip_01:  192.168.254.121/24

illegal_ip_02:   116.7.221.23/16

test_ip_01:   192.168.254.11

test_ip_02:   116.7.222.1

上述给定的两个test IP均不合法。

下面提供了c++解法

注:批量IP检查可以直接调用下面接口暴力循环,也可以先将所有的不合法IP转换为二进制保存到数组,然后再依次遍历,可以节约不少时间。

bool judgeLegelIp(string mask,string test){//将字符串转换为两个32位无符号整型进行比较uint32_t mask_bit=0;int i=0, k=3;while(i< mask.size()){string tempStr;    while(mask[i]!='.'&&mask[i]!='/'){tempStr+=mask[i++];}uint32_t b(stoi(tempStr)<<(k--)*8);mask_bit |= b;if(mask[i]=='/')break;++i;}++i;string temps;while(i<mask.size()){temps+=mask[i++];}uint32_t mask_bitcnt(stoi(temps));//记录掩码位数uint32_t test_bit=0;int j=0,m=3;while(j<test.size()){string s1;while(j<test.size()&&test[j]!='.'){s1+=test[j++];}uint32_t b(stoi(s1)<<(m--)*8);test_bit |= b;++j;}mask_bit>>=(32-mask_bitcnt);test_bit>>=(32-mask_bitcnt);return (mask_bit^test_bit);
}
//test example
int main(){string s1("192.168.254.11/24");string s2("192.168.254.221");string s3("192.168.221.1");if(judgeLegelIp(s1,s2))cout<<"legel IP"<<endl;else cout<<"illegel IP";return 0;
}

完整优化版本:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>    //stringstream
using namespace std;//c++实现split函数功能
vector<string> split(string s, char c){stringstream ss(s);vector<string> ans;string tmpStr;while(getline(ss,tmpStr,c)){if(!tmpStr.empty()){ans.push_back(tmpStr);}}return ans;
}uint32_t testip_to_num(string s){vector<string> res2 = split(s,'.');uint32_t ip_num = 0;int k =3;for(int i = 0; i < 4; ++i){ip_num |= (stoi(res2[i]) << 8*(k--));}return ip_num;
} pair<uint32_t, int> maskip_to_num(string s){pair<uint32_t, int>ans;vector<string> res1 = split(s,'/');string s1 = res1.front();vector<string> res2 = split(s1,'.');uint32_t ip_num = 0;int k =3;for(int i = 0; i < 4; ++i){ip_num |= (stoi(res2[i]) << 8*(k--));}int bit_str = stoi(res1.back());ans = make_pair(ip_num, bit_str);return ans;
}bool is_black_ip(string maskip, string test_ip){pair<uint32_t, int> pp = maskip_to_num(maskip);uint32_t testip = testip_to_num(test_ip);if((testip >> (32 - pp.second)) == (pp.first >> (32 - pp.second))){return true;}return false;
}int main (){int m,n;cin>>m>>n;string mask;string test;vector<string>v1(m),v2(n);int i = 0, j = 0;while(cin>>v1[i++], i < m);while(cin>>v2[j++], j < n);//output black ipfor(auto s2 : v2){for(auto s1 : v1){if(is_black_ip(s1,s2)){cout<<s2<<endl;}}}return 0;
}/*
//test example
2 4
121.121.121.28/24
113.121.121.23/20
121.121.121.121
113.121.116.198
113.121.144.2
224.121.121.112
*/

IP黑名单匹配(华为2021实习笔试)相关推荐

  1. 华为0510 实习笔试

    1.栈数据合并 向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设: 栈顶至栈底整数依次编号为n1.n2...nx, n1为最新压入的整数) 1.如果n1=n2,则n1.n2全部出栈,压入新数 ...

  2. 华为实习笔试2020.4.15

    昨晚做了华为实习笔试,真的是不做不知道,做了就知道在规定时间内会出现多少问题总结如下: 1. 以前做题总是祈求做完全AC,后面才发现,全AC是比较有难度的,当你改了不能全AC的时候,你就应该做下一题的 ...

  3. 2021广联达暑期实习笔试C++

    2020广联达暑期实习笔试 30道选择题,多数是给一段代码(类)判断输出: 编程题: 剪花 n只花,第i只的高度为h(i)厘米,最适宜生长的高度是w厘米,所以需要修剪.当修剪一只花时,其右边的花就会长 ...

  4. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.29)

    文章出处:http://blog.csdn.net/v_july_v/article/details/7974418 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 (参与算法&面 ...

  5. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.23)

    引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过.正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾 ...

  6. 2013九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试题

    九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...

  7. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题(10.11)

    九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 引言 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔/面试五十题 后记 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 (参与面 ...

  8. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.14)

    引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过.正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾 ...

  9. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题(10.09)

    九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题 (欢迎加入十月面试题集训组,参与讨论&解题:193308452) 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久), ...

最新文章

  1. 宠物龟 扫地机器人_有宠物家庭必选 岚豹扫地机器人太实用了
  2. fortran转换 matlab代码,将Fortran77代码转换为Matlab代码以查找特征值/向量
  3. moel vue 自定义v_vue在自定义组件中使用v-model的方法
  4. 一个简单的游戏服务器框架
  5. python pdf转word 表格_太赞了!Pdf转Word,我用Python 轻松搞定表格和水印!
  6. string 包含_一文搞懂String常见面试题,从基础到实战,到原理分析和源码解析...
  7. 1.13 编程基础之综合应用 05 素数回文数的个数 python
  8. HALCON 21.11:深度学习笔记---异常检测(9)
  9. 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
  10. Birth-Death process 生灭过程
  11. HTML基础网页布局代码写法
  12. Everthing搜索神器,工作利器
  13. Visual Studio Code (vscode)配置LaTeX最详细版(vscode下载安装+基本设置+内外pdf查看器设置+个人配置代码)
  14. (html)音乐之原生js简单的歌词滚动hah
  15. kali火狐浏览器设置中文
  16. 短视频技术指南:国内最牛5家短视频解决方案提供商评测
  17. BFC(块级格式化上下文)
  18. CA数字证书是什么?
  19. 打印机连接与计算机的,操作方法:教您如何将打印机与计算机连接
  20. Google-indexing api使用

热门文章

  1. 二叉树的先序、中序、后序以及层次遍历
  2. 巧用清单把待办事件安排的井井有条
  3. Element el-table 等表格组件超出隐藏(show-overflow-tooltip)按需展示且可鼠标移入
  4. CallKit iOS 教程
  5. 如何绘制0.5像素的边框
  6. 信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数
  7. Markdown 截图变图床贴图 Mac环境
  8. main方法和单元测试方法
  9. linux日文乱码,有关日文压缩文件乱码的问题
  10. excel怎么设置打印区域_excel打印区域页面设置