【机试】2017年03月07日阿里测试岗内推在线测试

来源:互联网 发布:手机作图软件下载 编辑:程序博客网 时间:2024/05/16 11:48

题目大意

给定一个只包含数字的字符串,恢复所有的非私网IP地址。
私网地址段:

A类:10.0.0.010.255.255.255 B类:172.16.0.0172.31.255.255 C类:192.168.0.0192.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