🚩传送门:牛客题目
力扣题目

题目

给定一个字符串 IP 。

  • 如果是有效的 IPv4 地址,返回 _"IPv4"_
  • 如果是有效的 IPv6 地址,返回 _"IPv6"_
  • 如果不是上述类型的 IP 地址,返回 _"Neither"_

示例 1:

输入:queryIP = “172.16.254.1” 输出:“IPv4” 解释:有效的 IPv4 地址,返回 “IPv4”

示例 2:

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

解题思路:字符串判断

有效的 IPv4 地址 是 “x1.x2.x3.x4” 形式的IP地址。

  • 其中 [NC]116. 验证IP地址 - 图1[NC]116. 验证IP地址 - 图2 不能包含 前导零。

有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 形式的IP地址。

  • [NC]116. 验证IP地址 - 图3 中允许前导零。
  • [NC]116. 验证IP地址 - 图4
  • [NC]116. 验证IP地址 - 图5 是一个 十六进制字符串 ,可以包含数字、大小写英文字母( 'A''F'

注意一种特殊情况:"2001:0db8:85a3:0:0:8A2E:0370:7334**:**"

当末尾是号时,通过split(":")分割出来的依旧是 8 组,因此需要加上一个判断,排除这种情况。

复杂度分析

时间复杂度: [NC]116. 验证IP地址 - 图6 ,其中 [NC]116. 验证IP地址 - 图7 是数组[NC]116. 验证IP地址 - 图8的长度。

空间复杂度:[NC]116. 验证IP地址 - 图9 ,其中 [NC]116. 验证IP地址 - 图10 是数组[NC]116. 验证IP地址 - 图11的长度。

我的代码

  1. public class Solution {
  2. public String solve (String IP) {
  3. // write code here
  4. // 判断是否是 IPv6
  5. if(IP.contains(":")){
  6. // 尾巴判断一下最后一个字符是否是":"
  7. if(IP.charAt(IP.length()-1)==':')return "Neither";
  8. // IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割
  9. String[]Ipv6s=IP.split(":");
  10. if(Ipv6s.length!=8)return "Neither";
  11. // 可以 0 开头的数字,字母可以使用大写,也可以是小写
  12. for(String ipv6:Ipv6s){
  13. // 长度要求在[1,4]之间,可以有前导0
  14. if(ipv6.length()>4||ipv6.length()<1) return "Neither";
  15. // 16进制的数字来表示
  16. for(int i=0;i<ipv6.length();i++){
  17. // 判断是否是16进制数,是就分号;什么也不做
  18. if(('A'<=ipv6.charAt(i)&&ipv6.charAt(i)<='F')||
  19. ('a'<=ipv6.charAt(i)&&ipv6.charAt(i)<='f')||
  20. ('0'<=ipv6.charAt(i)&&ipv6.charAt(i)<='9')
  21. );// 分号结束,无执行语句
  22. else return "Neither";
  23. }
  24. }
  25. return "IPv6";
  26. }else{ // IPv4
  27. // IPv4 每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割
  28. String[]Ipv4s=IP.split("\\.");
  29. // 判断是否是4组数字
  30. if(Ipv4s.length!=4)return "Neither";
  31. for(String ipv4:Ipv4s){
  32. // IPv4 地址内的数不会以 0 开头
  33. if(ipv4==null||ipv4.length()==0||ipv4.charAt(0)=='0')
  34. return "Neither";
  35. // 判断是否是数字
  36. for(int i=0;i<ipv4.length();i++){
  37. if('0'<=ipv4.charAt(i)&&ipv4.charAt(i)<='9'); // 分号结束,无执行语句
  38. else return "Neither";
  39. }
  40. // 判断是否值范围在[0,255]
  41. int Ipv4num=Integer.parseInt(ipv4);
  42. if(!(0<=Ipv4num&&Ipv4num<=255)) return "Neither";
  43. }
  44. return "IPv4";
  45. }
  46. }
  47. }