算法-一组ip得到没有连续的那个最小的IP

发布于 2017-10-23 00:40:02 字数 176 浏览 1380 评论 1

一组ip得到没有连续的那个最小的IP
比如
172.30.1.1,172.30.1.2,172.30.2.4,172.30.1.10
要得到172.30.1.2 这个ip到172.30.1.3 没有连续出现,怎么快速得到172.30.1.2
穷举可以得到。
还有不有其他高性能的算法?请教

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2017-10-24 04:22:47

兄弟,你这个表述我完全看不懂,写清楚一点吧,可能写清楚一点你自己就知道怎么实现这个逻辑了

不过我猜你应该需要这样的效果:

package com.zycj.code.dici.util;

import java.util.Set;
import java.util.TreeSet;

public class IpFilter {
    private Set<Long> ips = new TreeSet<Long>();

    private IpFilter() {

    }

    private IpFilter(String... ips) {
        for (String ip : ips) {
            addIp(ip);
        }
    }

    public void addIp(String ip) {
        ips.add(ipToLong(ip));
    }

    private long ipToLong(String ip) {
        String[] split = ip.split("\.");
        String hex = "";
        for (String nu : split) {
            hex += numberToHex(nu);
        }
        return Long.parseLong(hex, 16);
    }

    private String numberToHex(String nu) {
        String string = Long.toString(Long.parseLong(nu), 16);
        for (int i = string.length(); i < 2; i++) {
            string = "0" + string;
        }
        return string;
    }

    public String getMinNoLianxu() {
        long current = -1;
        for (Long ip_l : ips) {
            if (current == -1 ) {
                current = ip_l;
            } else {
                if(ip_l%256==1 && ip_l-current==3){//1-254
                    current = ip_l;
                }else if(ip_l-current==1){
                    current = ip_l;
                }else{
                    return longToIp(current);
                }
            }
        }
        return null;
    }

    private String longToIp(long current) {
        String hex = Long.toString(current, 16);
        String result = "";
        for(int i=0;i<4;i++){
            String substring = hex.substring(i*2, i*2+2);
            long parseLong = Long.parseLong(substring, 16);
            String r = Long.toString(parseLong, 10);
            result += r+".";
        }
        return result.substring(0, result.length()-1);
    }
}

测试代码:

public static void main(String[] args) {
        IpFilter ipFilter = new IpFilter();
        ipFilter.addIp("192.168.0.253");
        ipFilter.addIp("192.168.0.254");
        ipFilter.addIp("192.168.1.2");
        ipFilter.addIp("192.168.1.3");
        System.out.println(ipFilter.getMinNoLianxu());
    }

打印结果:

192.168.0.254
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文