面试-验证IP地址

题目

给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 “IPv4” ;如果是有效的 IPv6 地址,返回 “IPv6”;如果不是上述类型的 IP 地址,返回 “Neither” 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。
例如:“192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:1 <= xi.length <= 4 xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( ‘a’ 到 ‘f’ )和大写英文字母(‘A’ 到 ‘F’ )。 在 xi 中允许前导零。 例如 “2001:0db8:85a3:0000:0000:8a2e:0370:7334"和 “2001:db8:85a3:0:0:8A2E:0370:7334” 是有效的 IPv6 地址,而 “2001:0db8:85a3::8A2E:037j:7334” 和"02001:0db8:85a3:0000:0000:8a2e:0370:7334” 是无效的 IPv6 地址。

在这里插入图片描述

思路

模拟题,没什么意思,面向测试用例编程,但是面试高频,腾讯,字节,阿里,华为面试都考过!!

class Solution {
    public String validIPAddress(String queryIP) {
        if(queryIP.indexOf('.') > 0){//如果是ipv4
            return isIpV4(queryIP) ? "IPv4" : "Neither";
        } else {//如果是ipv6,因为ipv6没有.,全是:
            return isIpV6(queryIP) ? "IPv6" : "Neither";
        }
    }
    public boolean isIpV4(String quertIP){
        //加-1是防止出现空字符串无法计数 比如192.168.1.1. 后边多了一个点,不加-1会被忽略后边的空串
        //.split("\\.", -1)会保存空值
        //且split()使用“.” “\” “|“ “*“ “+“来分割时,需要转义,其中如果是“\”要写成“\\\\”
        String[] split = quertIP.split("\\.", -1);
        //个数不是4个
        if(split.length != 4){
            return false;
        }
        for(String s : split){
            //每个长度不在 1-3之间
            if(s.length() > 3 || s.length() == 0){
                return false;
            }
            //有前导0 并且长度不为1
            if(s.charAt(0) == '0' && s.length() != 1){
                return false;
            }
            //计算数字
            int ans = 0;
            for(int j = 0; j < s.length(); j++){
                char c = s.charAt(j);
                //如果不是数字
                if(!Character.isDigit(c)){
                    return false;
                }
                ans = ans * 10 + c - '0';
            }
            //数字超过255
            if(ans > 255){
                return false;
            }
        }
        return true;
    }
    public boolean isIpV6(String queryIP){
        String[] split = queryIP.split(":", -1);//不需要转义
        //数量不是8个
        if(split.length != 8){
            return false;
        }
        for(String s : split){
            //每个串 长度不在1-4之间
            if(s.length() > 4 || s.length() == 0){
                return false;
            }
            for(int i = 0; i < s.length(); i++){
                char c = s.charAt(i);
                //不是数字并且字母不在 a-f之间
                if(!Character.isDigit(c) && !(Character.toLowerCase(c) >= 'a') || !(Character.toLowerCase(c) <= 'f')){
                    return false;
                }
            }
        }
        return true;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HDU-五七小卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值