阿里2017实习机试题——纯数字字符串恢复到非私有网段地址组合

来源:互联网 发布:手机扣字软件 编辑:程序博客网 时间:2024/06/10 04:31

题目:

给定一组只包含数字的字符串,请恢复到有效的非私有网段地址组合。私有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


类似于LeetCode 93题:Restore IP Addresses


采用的是比较暴力的方法。

将数字字符串分割成4段,合法IP为:每一段长度为1-3,数字范围0-255,某一段以0开头则必须为0,不能是00或000。

采用投机取巧的方式将每一段数字字符串先转换成数字,这样就将00和000的情况都转换为了0,同时用数字区间[0,255]来验证每一段的合法性。

再添加“.”拼接成点分型的IP地址,如果拼接的新地址串与原数字串相比长度不是增加了3(3个点),说明分割的串中出现了00或000的情况,不合法,舍弃。


私有地址的判定采用正则表达式,由于之前已经判定了地址的合法性,不再判定地址本身是否合法。


import java.util.ArrayList;import java.util.Scanner;import java.util.regex.Pattern;public class Main {    static String[] parseValidateIp(String inputStr) {    Pattern patternA = Pattern.compile("10\\..*") ;       Pattern patternB = Pattern.compile("172\\.((1[6-9])|(2[0-9])|(3[0-1]))\\..*") ;       Pattern patternC = Pattern.compile("192\\.168\\..*") ;      ArrayList<String> list = new ArrayList<String>();    for(int i = 1 ; i <= 3 ; i++){for(int j = 1 ; j <= 3 ; j++){for(int k = 1 ; k <= 3 ; k++){int m = inputStr.length() - (i + j + k);if( m > 0 && m <= 3){StringBuffer sb = new StringBuffer();int addr1 = Integer.parseInt(inputStr.substring(0, i));int addr2 = Integer.parseInt(inputStr.substring(i, i+j));int addr3 = Integer.parseInt(inputStr.substring(i+j, i+j+k));int addr4 = Integer.parseInt(inputStr.substring(i+j+k));if(addr1 <= 255 && addr2 <= 255 && addr3 <= 255 && addr4 <= 255){sb.append(addr1).append('.').append(addr2).append('.').append(addr3).append('.').append(addr4);if(sb.length() == inputStr.length() + 3){String ip = sb.toString();if(!(patternA.matcher(ip).matches()||patternB.matcher(ip).matches()||patternC.matcher(ip).matches())){list.add(ip);}}}}}}}    String[] result = (String[]) list.toArray(new String[list.size()]);    return result;    }    public static void main(String[] args){        Scanner in = new Scanner(System.in);        String[] res;                    String _inputStr;        try {            _inputStr = in.nextLine();        } catch (Exception e) {            _inputStr = null;        }          res = parseValidateIp(_inputStr);        for(int res_i=0; res_i < res.length; res_i++) {            System.out.println(String.valueOf(res[res_i]));        }    }}


0 0
原创粉丝点击