如何显示可以从一串数字创建的所有IP地址组合?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何显示可以从一串数字创建的所有IP地址组合?相关的知识,希望对你有一定的参考价值。

我需要将输入字符串格式化为IP地址格式,所以我有以下代码;但是,数字是固定的,我不知道如何为单个输入生成不同的值。

其他限制是确保没有一组数字超过255,但在这种情况下,我只想将它们分成四个独立的组,每组必须有1到3个成员。

Vimal的问题:从提供的字符串19216801,我认为你无法识别确切的IP。它可以是192.168.0.1或19.216.80.1或任何其他组合。

答:我不是在寻找任何特定的IP,我只需要显示所有可能的组合。

样本格式

一些组合如下

   Expected result | number of input characters

   1.1.1.1             4 
     ....
   1.1.1.2             5
   1.1.2.1  
   1.2.1.1  
   2.1.1.1 
     ....       
   1.1.1.3             6
   1.1.3.1  
   1.3.1.1   
   3.1.1.1  
     ....
   2.2.2.1             7
   2.2.1.2 
     ....
   2.2.2.2             8
   3.2.2.1 
   1.2.2.3 
     ....
   2.2.2.3             9 
   3.3.2.1 
   1.2.3.3 
     ....
   3.3.3.1             10
   3.3.1.3  
   3.1.3.3
   1.3.3.3 
     ....
   3.3.3.2             11
   3.3.2.3 
   3.2.3.3 
     ....
   3.3.3.3             12

String number = "19216801";
if (number.length() == 4) {
    StringBuilder sb = new StringBuilder(number)
            .insert(1, ".")
            .insert(1, ".")
            .insert(1, ".")
            .insert(1, ".");
    String output = sb.toString();
    System.out.println(output);
}
 if (number.length() == 8) {
    StringBuilder sb = new StringBuilder(number)
            .insert(2, ".")
            .insert(2, ".")
            .insert(2, ".")
            .insert(2, ".");
    String output = sb.toString();
    System.out.println(output);
}
  if (number.length() == 12) {
    StringBuilder sb = new StringBuilder(number)
            .insert(3, ".")
            .insert(3, ".")
            .insert(3, ".")
            .insert(3, ".");
    String output = sb.toString();
    System.out.println(output);
}
答案

这是一个递归解决方案:

public static void main(String[] args){

    System.out.println(findIPs("1234567", 3));
}

public static List<String> findIPs(String s,int dots){

    List<String> ips = new ArrayList<>();

    for(int i =1 ;i<=3 && i < s.length(); i++){

        String cip = s.substring(0,i);

        if(Integer.parseInt(cip) < 256){
            if(dots == 1){
                if( Integer.parseInt(s.substring(i)) < 256) {
                    ips.add(cip + "." + s.substring(i));
                }
            }else {
                for (String ip : findIPs(s.substring(i), dots - 1)) {
                    ips.add(cip + "." + ip);
                }
            }
        }
    }

    return ips;

}
另一答案

以下是解决上述解决方案之一的错误ips问题的解决方案

    private static List<String> ips = new ArrayList<>();
    public static void main(String[] args) {

        Date d = new Date();
        System.out.println(posIps("19216801"));
        System.out.println(new Date().getTime() - d.getTime());

    }

    private static List<String> posIps(String number) {
        int l = number.length() - 3;
        for (int a = 0; a < 3 && a < l; a++) {
            for (int b = 0; b < 3 && b < l - a; b++) {
                for (int c = 0; c < 3 && c < l - a - b; c++) {
                    StringBuilder sb = new StringBuilder(number);
                    if (Integer.parseInt(sb.substring(0, a + 1 )) < 256
                            && Integer.parseInt(sb.substring(a + 1, a + b + 2)) < 256
                            && Integer.parseInt(sb.substring(a + b + 2, a + b + c + 3)) < 256
                            && Integer.parseInt(sb.substring(a + b + c + 3)) < 256) {
                        sb.insert(a + 1, ".");
                        sb.insert(a + b + 3, ".");
                        sb.insert(a + b + c + 5, ".");
                        ips.add(sb.toString());
                    }
                }
            }
        }
        return ips;
    }
另一答案

这段代码工作正常,检查一下。

public static void main(String[] args) {
    String input = "121212111";
    for (String ipAddress : generatePossibleIpAddresses(input, 3)) {
        System.out.println(ipAddress);
    }
}

public static ArrayList<String> generatePossibleIpAddresses(String ipAddress, int dot) {
    ArrayList<String> list = new ArrayList<String>();

    if (ipAddress == null || ipAddress.length() == 0) {
        return list;
    }

    if (dot == 0) {
        int i = Integer.parseInt(ipAddress);
        if (i < 256) {
            list.add(ipAddress);
        }
        return list;
    }

    for (int i = 1; i <= 3; i++) {
        int num = Integer.parseInt(ipAddress.substring(0, i));
        if (num < 256) {
            for (String str : generatePossibleIpAddresses(ipAddress.substring(i), dot - 1)) {
                list.add(num + "." + str);
            }
        }
    }
    return list;
}

以上是关于如何显示可以从一串数字创建的所有IP地址组合?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 从一组数字中查找 n 项的所有组合?

EXCEL,怎么样可以从一串字符中的某个指定位置截取字符.

对于仅包含数字的给定字符串,返回所有有效IP地址组合的最佳方法是什么?

java如何从一串字符串中拆分出姓名地址和电话号码

dockerGitlabgitlab中clone项目时,IP地址是一串数字(内网Gitlab的IP地址不正确)的问题解决

怎么用cmd查看电脑ip