zl程序教程

您现在的位置是:首页 >  其他

当前栏目

​LeetCode刷题实战468:验证IP地址

2023-04-18 15:01:45 时间

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 验证IP地址,我们先来看题面:

https://leetcode-cn.com/problems/validate-ip-address/

示例

示例 1:

输入:IP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"

示例 2:

输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"

示例 3:

输入:IP = "256.256.256.256"
输出:"Neither"
解释:既不是 IPv4 地址,又不是 IPv6 地址

解题

https://www.freesion.com/article/5594817898/

思路是这样的:

1.先判断是不是ipv4。

没有“.”的不是;把整个字符串以“.”分开,不是四段的不是,凡是有某一段长度大于3或者为0的不是;每一段数字判断段大小(0-255)同时判断有没有多余的前0。

2.再判断是不是ipv6

先转小写字母。没有“:”的不是;(除了“:”)出现不是数字或者不是a-f字符的不是;以“:”分开成若干段,不是8段的不是;每段长度大于4的不是。

class Solution {
    public String validIPAddress(String IP) {
        if(isIp4(IP)){return "IPv4";}
        if(isIp6(IP)){return "IPv6";}
        return "Neither";
    }
    public boolean isIp4(String ip){
        ip=ip.trim();
        if(ip.contains(".")){
            for(int i=0;i<ip.length();i++){
                char c=ip.charAt(i);
                if(c!='.'&&!Character.isDigit(c)){return false;}
            }
            String ip4[]=ip.split("\.",-1);//-1表示末尾开头的到的叶算,跟进空字符串
            if(ip4.length!=4){return false;}//ip4的是4段数
            for(int i=0;i<4;i++){
                int l=ip4[i].length(); 
                if(l==0||l>3){return false;}//注意空数字,判断32位超范围
                int shu=Integer.parseInt(ip4[i]);
                if(shu>255||(shu<10&&l>1)||(shu<100&&l>2)){
                    //每个数字开头不能是0,除非就是0
                    return false;
                }
            }
        }
        else{return false;}
        return true;
    }
    public boolean isIp6(String ip){
        ip=ip.trim().toLowerCase();//防止大小写混用
        if(ip.contains(":")){
            for(int i=0;i<ip.length();i++){
                char c=ip.charAt(i);
                if(c!=':'&&!(c>='0'&&c<='9')&&!(c>='a'&&c<='f')){
                    return false;
                }
            }
            String[] ip6=ip.split("\:",-1);
            if(ip6.length!=8){return false;}
            for(int i=0;i<8;i++){
                //ip6要有8段 
                int l=ip6[i].length();
                if(l==0||l>4){return false;}//if(l>4){return false;} 
            }
        }
        else{return false;}
        return true;
    }
}

好了,今天的文章就到这里 。