IP黑名单匹配(华为2021实习笔试)
题目:找出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实习笔试)相关推荐
- 华为0510 实习笔试
1.栈数据合并 向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设: 栈顶至栈底整数依次编号为n1.n2...nx, n1为最新压入的整数) 1.如果n1=n2,则n1.n2全部出栈,压入新数 ...
- 华为实习笔试2020.4.15
昨晚做了华为实习笔试,真的是不做不知道,做了就知道在规定时间内会出现多少问题总结如下: 1. 以前做题总是祈求做完全AC,后面才发现,全AC是比较有难度的,当你改了不能全AC的时候,你就应该做下一题的 ...
- 2021广联达暑期实习笔试C++
2020广联达暑期实习笔试 30道选择题,多数是给一段代码(类)判断输出: 编程题: 剪花 n只花,第i只的高度为h(i)厘米,最适宜生长的高度是w厘米,所以需要修剪.当修剪一只花时,其右边的花就会长 ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.29)
文章出处:http://blog.csdn.net/v_july_v/article/details/7974418 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 (参与算法&面 ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.23)
引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过.正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾 ...
- 2013九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试题
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题(10.11)
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 引言 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔/面试五十题 后记 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 (参与面 ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.14)
引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过.正如上一篇文章支持向量机通俗导论(理解SVM的三层境界)末尾 ...
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题(10.09)
九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试五十题 (欢迎加入十月面试题集训组,参与讨论&解题:193308452) 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久), ...
最新文章
- 宠物龟 扫地机器人_有宠物家庭必选 岚豹扫地机器人太实用了
- fortran转换 matlab代码,将Fortran77代码转换为Matlab代码以查找特征值/向量
- moel vue 自定义v_vue在自定义组件中使用v-model的方法
- 一个简单的游戏服务器框架
- python pdf转word 表格_太赞了!Pdf转Word,我用Python 轻松搞定表格和水印!
- string 包含_一文搞懂String常见面试题,从基础到实战,到原理分析和源码解析...
- 1.13 编程基础之综合应用 05 素数回文数的个数 python
- HALCON 21.11:深度学习笔记---异常检测(9)
- 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
- Birth-Death process 生灭过程
- HTML基础网页布局代码写法
- Everthing搜索神器,工作利器
- Visual Studio Code (vscode)配置LaTeX最详细版(vscode下载安装+基本设置+内外pdf查看器设置+个人配置代码)
- (html)音乐之原生js简单的歌词滚动hah
- kali火狐浏览器设置中文
- 短视频技术指南:国内最牛5家短视频解决方案提供商评测
- BFC(块级格式化上下文)
- CA数字证书是什么?
- 打印机连接与计算机的,操作方法:教您如何将打印机与计算机连接
- Google-indexing api使用
热门文章
- 二叉树的先序、中序、后序以及层次遍历
- 巧用清单把待办事件安排的井井有条
- Element el-table 等表格组件超出隐藏(show-overflow-tooltip)按需展示且可鼠标移入
- CallKit iOS 教程
- 如何绘制0.5像素的边框
- 信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数
- Markdown 截图变图床贴图 Mac环境
- main方法和单元测试方法
- linux日文乱码,有关日文压缩文件乱码的问题
- excel怎么设置打印区域_excel打印区域页面设置