字符串转换为合法IP地址

问题描述

给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。

那么首先我们需要了解ip地址的及其格式。

IP地址及其格式

IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

解决方案

我们如果使用java解决这个问题,可以这样,

import java.util.ArrayList;
public class Solution {
    
    /**
     * @param s the IP string
     * @return All possible valid IP addresses
     */
    public static boolean isValid(String s){
        if (s.charAt(0)=='0') return s.equals("0");
        int num = Integer.parseInt(s);
        return num<=255 && num>0;
    }
    public static ArrayList<String> restoreIpAddresses(String s) {
        // Write your code here
        ArrayList<String> res = new ArrayList<String>();
        if (s.length()<4||s.length()>12) return res;
        dfs(s,"",res,0);
        return res;
    }
    public static void dfs(String s, String tmp, ArrayList<String> res, int count){
        if (count == 3 && isValid(s)) {
            res.add(tmp + s);
            return;
        }
        for(int i=1; i<4 && i<s.length(); i++){
            String substr = s.substring(0,i);
            if (isValid(substr)){
                dfs(s.substring(i), tmp + substr + '.', res, count+1);
            }
        }
    }
    
}

测试代码如下,

public class Test {
	public static void main(String [] args)
	{		
		System.out.println(Solution.restoreIpAddresses("25525511135"));
	}
}

测试结果如下,

[255.255.11.135, 255.255.111.35]

符合我们的预期目标。

语法细节

其中代码中的语法细节之一是static method 的调用。当我们在一个类中调用另外一个类的方法时,需要注意有两种可能,

class A{
  public void methodA(){
    new B().methodB();
    //or
    B.methodB1();
  }}class B{
  //instance method
  public void methodB(){
  }
  //static method
  public static  void methodB1(){
  }}

转载于:https://my.oschina.net/donngchao/blog/551736

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值