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

程序IT圈

共 1712字,需浏览 4分钟

 ·

2021-12-18 11:20

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


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-460题汇总,希望对你有点帮助!

LeetCode刷题实战461:汉明距离

LeetCode刷题实战462:最少移动次数使数组元素相等 II

LeetCode刷题实战463:岛屿的周长

LeetCode刷题实战464:我能赢吗

LeetCode刷题实战465:最优账单平衡

LeetCode刷题实战466:统计重复个数

LeetCode刷题实战467:环绕字符串中唯一的子字符串



浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报