Leetcode 468. 验证IP地址(DAY 254)---- 后端面试题

本文介绍了如何编写一个C++函数,用于判断输入的字符串是否符合IPv4或IPv6的格式。通过对输入字符串的逐字符检查,确保每个部分的合法性,并递归地处理IP地址的不同部分。最后,该函数返回相应的IP类型或`Neither`。代码实现中包含了一些关键的边界条件检查和错误处理。
摘要由CSDN通过智能技术生成


原题题目


在这里插入图片描述


代码实现(首刷自解 面试遇到这种题 那就太逆天了)


class Solution {
public:
    string judge_ip(const string& queryIP,int pos,int times,int ip_type)
    {
        if(pos == queryIP.size())
        {
            if(ip_type == 0 && times == 4)      return "IPv4";
            else if(ip_type == 1 && times == 8) return "IPv6";
            else                                return "Neither";

            return "";
        }

        if(!isalnum(queryIP[pos]))  return "Neither";

        string tmp;
        int size = queryIP.size();
        while(pos < size)
        {
            if(tmp.size() > 4)  return "Neither";
            if(!isalnum(queryIP[pos]))   break;
            if(queryIP[pos] > 'f' && queryIP[pos] < 'z' || queryIP[pos] > 'F' && queryIP[pos] < 'Z')
                return  "Neither";
            if(!ip_type && !isdigit(queryIP[pos]))    return "Neither";
            tmp += queryIP[pos++];
        }

        if(queryIP[pos] != ':' && queryIP[pos] != '.')
            return "Neither";

        if(ip_type == 1 && queryIP[pos] != ':' || ip_type == 0 && queryIP[pos] != '.')
            return "Neither";


        if(ip_type == -1)
        {
            ip_type = (queryIP[pos] == '.' ? 0 : 1);
            if(!ip_type)   
            {
                for(const auto& chr:tmp)
                {
                    if(!isdigit(chr))
                        return "Neither";
                }
            }
        }

        if(!ip_type)
        {
            auto num = stoi(tmp);   
            if(!tmp.size() ||  num < 0 || num > 255 || tmp[0] == '0' && tmp.size() > 1)
                return "Neither";
        }
        else
        {
            if(tmp.size() < 1 || tmp.size() > 4)    return "Neither";   
        }

        return judge_ip(queryIP,pos + 1,times + 1,ip_type);   
    }

    string validIPAddress(string queryIP) {
        char add_chr = 0;
        for(const auto& chr:queryIP)
        {
            if(chr == '.' || chr == ':')
            {
                add_chr = chr;
                break;
            }
        }

        queryIP += add_chr;

        return judge_ip(queryIP,0,0,-1);
    }
};

代码实现(二刷自解 DAY 12 golang)


func judgeIPv4(queryIP string) string {
  items := strings.Split(queryIP, ".")
  if len(items) != 4 {
    return "Neither"
  } 

  for _, ip := range items {
    intip, err := strconv.Atoi(ip)
    if err != nil {
      return "Neither"
    }
    if intip < 0 || intip > 255 || intip == 0 && len(ip) > 1 || intip != 0 && ip[0] == '0' {
      return "Neither"
    }
  }
  return "IPv4"
}

func judgeIPv6(queryIP string) string {
  items := strings.Split(queryIP, ":")
  if len(items) != 8 {
    return "Neither"
  } 

  for _, ip := range items {
    if iplen := len(ip); iplen <= 0 || iplen > 4 {
      return "Neither"
    }
    for _, chr := range ip {
      if !(chr >= 'a' && chr <= 'f') && !(chr >= 'A' && chr <= 'F') && !(chr >= '0' && chr <= '9')  {
        return "Neither"
      }
    }
  }
  return "IPv6"
}

func validIPAddress(queryIP string) string {
  ret := "Neither"
  if strings.Contains(queryIP, ".") {
    ret = judgeIPv4(queryIP)
  }
  if strings.Contains(queryIP, ":") {
    ret = judgeIPv6(queryIP)
  }

  return ret
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Love 6

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

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

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

打赏作者

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

抵扣说明:

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

余额充值