【机试】2017年03月07日阿里测试岗内推在线测试
来源:互联网 发布:手机作图软件下载 编辑:程序博客网 时间:2024/05/16 11:48
题目大意
给定一个只包含数字的字符串,恢复所有的非私网IP地址。
私网地址段:
A类:10.0.0.0~10.255.255.255 B类:172.16.0.0~172.31.255.255 C类:192.168.0.0~192.168.255.255
解题思路
深搜+剪枝
网络IP地址分为四个部分,每个部分的限制条件大同小异,所以可以考虑使用深搜。
注意仔细处理非法地址和私网地址,进行剪枝即可。
更多细节请看代码注释。
CPP代码
#include <iostream>#include <vector>#include <numeric>#include<limits>#include <iostream>#include <vector>#include <numeric>#include<limits>#include <algorithm>#include <cassert>using namespace std;void dfs(string inputStr, int startIdx, int step, string ip, vector<string>& ans) { // 后面每个字段都超过3或者有些字段小于1,都是不合法的,剪掉 if (inputStr.size() - startIdx > (4 - step) * 3) return; if (inputStr.size() - startIdx < (4 - step)) return; //合法情况 if (startIdx == inputStr.size() && step == 4) { ans.push_back(ip); return; } int num = 0; for (int i = startIdx; i < startIdx + 3; ++i) { num = num * 10 + (inputStr[i] - '0'); //剪掉A类网段: 10.0.0.0 ~ 10.255.255.255 if (step == 0 && num == 10) { ip += inputStr[i]; continue; } if (step == 1) { //找到ip中第一个字段并转换为数字 int j = 0; for (; j < ip.size(); ++j) { if (ip[j] == '.') break; } string firstStr = ip.substr(0, j); int firstNum = 0; for (j = 0; j < firstStr.size(); ++j) { firstNum = firstNum * 10 + (firstStr[j] - '0'); } //剪掉B类网段: 172.16.0.0 ~ 172.31.255.255 if (firstNum == 172 && num >= 16 && num <= 31) { ip += inputStr[i]; continue; } //剪掉C类网段: 192.168.0.0 ~ 192.168.255.255 if (firstNum == 192 && num == 168) break; } //节点合法,继续往下递归 if (num <= 255) { ip += inputStr[i]; dfs(inputStr, i + 1, step + 1, ip + '.', ans); } //对于0,只允许作为单个,不允许出现在前缀中 if (num == 0) break; }}vector < string > parseValidateIp(string inputStr) { vector<string> ans; string ip; dfs(inputStr, 0, 0, ip, ans); return ans;}int main() { vector < string > res; string _inputStr; getline(cin, _inputStr); res = parseValidateIp(_inputStr); for(int res_i=0; res_i < res.size(); res_i++) { cout << res[res_i] << endl;; } return 0;}
0 0
- 【机试】2017年03月07日阿里测试岗内推在线测试
- 【机试】2017年03月06日阿里测试岗内推在线测试
- 2014年8月29日阿里校招在线笔试部分题--软件测试开发
- 2017年10月3日测试
- 阿里在线测试题目
- 2012年03月19日测试第三课総結
- 2017年9月26日——测试文章
- 2014年5月21日测试
- 10月27日测试
- 2014阿里前端实习生在线测试题目
- 2014阿里前端实习生在线测试题目
- 阿里开发测试工程师在线笔试
- 阿里2017算法工程师在线笔试编程——8月25日
- 05年5月21日-一篇测试题
- 2013年6月22日软件测试工作日记
- 初识阿里云2017年10月10日090449
- 测试培训的对话 - 发表于 @ 2008年09月03日
- 8月17日--测试用例
- 一对多映射
- 有向图的几个算法分析总结
- mybatis update
- javaFile类方法介绍
- 记一次使用xutils3的数据库模块的教训org.xutils.ex.DbException: <init> []
- 【机试】2017年03月07日阿里测试岗内推在线测试
- 递归大总结之台阶问题
- linux 根目录扩容
- oracle之表间数据的拷贝
- QQ登录集成官方SDK(Activity+Fragment)
- VPN-APP设想
- OtherForm学习笔记
- 【php】echo与var_dump
- Mybatis 拦截器内部代码解析