• leetcode 468 验证IP地址是否有效(竟然花费了两个小时)


    468. 验证IP地址

    中等

    222

    相关企业

    给定一个字符串 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 地址。

    示例 1:

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

    示例 2:

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

    示例 3:

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

    提示:

    • queryIP 仅由英文字母,数字,字符 '.' 和 ':' 组成。

    思路很简单,按照规则进行字符串检测就行了,但是总有想不到的异常,所以就一直在调试。

    直接上解答:

    1. class Solution {
    2. vector split(const string& str, const string& delim) {
    3. vector res;
    4. if("" == str) return res;
    5. //先将要切割的字符串从string类型转换为char*类型
    6. char * strs = new char[str.length() + 1] ; //不要忘了
    7. strcpy(strs, str.c_str());
    8. char * d = new char[delim.length() + 1];
    9. strcpy(d, delim.c_str());
    10. char *p = strtok(strs, d);
    11. while(p) {
    12. string s = p; //分割得到的字符串转换为string类型
    13. res.push_back(s); //存入结果数组
    14. p = strtok(NULL, d);
    15. }
    16. delete[] d;
    17. delete[] strs;
    18. return res;
    19. }
    20. bool isValid(char ch)
    21. {
    22. if(ch>='0' && ch<='9')
    23. {
    24. return true;
    25. }
    26. else if(ch>='a' && ch<='f')
    27. {
    28. return true;
    29. }
    30. else if(ch>='A' && ch<='F')
    31. {
    32. return true;
    33. }
    34. else
    35. return false;
    36. }
    37. public:
    38. string validIPAddress(string queryIP) {
    39. int len4=0;
    40. int len6=0;
    41. for(auto i:queryIP)
    42. {
    43. if(i=='.')
    44. {
    45. len4++;
    46. }
    47. if(i==':')
    48. {
    49. len6++;
    50. }
    51. }
    52. if(len4>0 && len4!=3)
    53. {
    54. return "Neither";
    55. }
    56. if(len6>0 && len6!=7)
    57. {
    58. return "Neither";
    59. }
    60. vector ipv4Str=split(queryIP,".");
    61. if(ipv4Str.size()==4)
    62. {
    63. if(queryIP[0]=='.' || queryIP[queryIP.size()-1]=='.')
    64. {
    65. return "Neither";
    66. }
    67. bool ipv4Flag=true;
    68. for(auto i:ipv4Str)
    69. {
    70. int a=atoi(i.c_str());
    71. if(a>255)
    72. {
    73. ipv4Flag=false;
    74. break;
    75. }
    76. else
    77. {
    78. string tem=to_string(a);
    79. if(tem!=i)
    80. {
    81. ipv4Flag=false;
    82. break;
    83. }
    84. }
    85. }
    86. if(ipv4Flag)
    87. {
    88. return "IPv4";
    89. }
    90. else
    91. {
    92. return "Neither";
    93. }
    94. }
    95. else
    96. {
    97. vector ipv6Str=split(queryIP,":");
    98. if(ipv6Str.size()==8)
    99. {
    100. if(queryIP[0]!=':' && queryIP[queryIP.size()-1]!=':')
    101. {
    102. bool ipv6Flag=true;
    103. for(auto i:ipv6Str)
    104. {
    105. if(i.size()>4)
    106. {
    107. ipv6Flag=false;
    108. break;
    109. }
    110. else
    111. {
    112. for(auto j:i)
    113. {
    114. if(!isValid(j))
    115. {
    116. ipv6Flag=false;
    117. break;
    118. }
    119. }
    120. }
    121. }
    122. if(ipv6Flag)
    123. {
    124. return "IPv6";
    125. }
    126. else
    127. {
    128. return "Neither";
    129. }
    130. }
    131. else
    132. {
    133. return "Neither";
    134. }
    135. }
    136. else
    137. {
    138. return "Neither";
    139. }
    140. }
    141. }
    142. };

    虽然代码比较不怎么样,但是时间上100%,验证字符串是否有前导0,使用了转为int之后,再转为字符串,如果两个字符串相等就是没有,否则就是有。同时使用了字符串分割函数,这个分割函数的bug就是如果两个分隔符之间什么都没有,就不会返回数据,这点也需要后续改进。

  • 相关阅读:
    跨界电商、游戏技与代理IP的关联
    Bingo NFT 如何帮助交易者和投资者分析市场
    idea中启动maven项目报错-java: 程序包lombok.extern.slf4j不存在问题如何解决
    FileWriter的覆盖和追加模式
    docker 装机/卸载 Mysql
    微服务中的服务发现是什么?
    【数仓】经典面试题总结-史上最全面试题思维导图总结(2022最新版)
    参数估计的均方误差(MSE),偏置(Bias)与方差(Variance)分解,无偏估计
    MS1826A HDMI 多功能视频处理器 HDMI4进1出画面分割芯片
    过滤器(Filter)
  • 原文地址:https://blog.csdn.net/weixin_41579872/article/details/128167743