468. 验证IP地址
目录
题目链接
题目
解题思路
代码
题目链接
468. 验证IP地址 - 力扣(LeetCode)
题目
解题思路
用split()分隔字符串,第二个参数为-1可以保留空串(比如12..23可以分隔为12,,23)
遍历第一个分隔符,更新flag来确定是判断IPv4还是IPv6
判断IPv6
满足以下条件之一则可返回Neither,否则最后返回IPv6
分隔后的字符串数组长度≠8
当前字符串长度>4或者当前字符串为空
当前字符串不满足16进制
判断IPv4
满足以下条件之一则可返回Neither,否则最后返回IPv4
当前字符串数组长度≠4
当前字符串为空
当前字符串转为整数失败(测试用例中有子串为1e1这种是转不了整数的)
当前字符串转化的整数>255或者当前字符串包含前导0
代码
class Solution {public String validIPAddress(String queryIP) {//首先判断分隔符是.还是:boolean flag = false;for (int i = 0; i < queryIP.length(); i++) {if(queryIP.charAt(i) == '.'){flag = true;break;} else if (queryIP.charAt(i) == ':') {flag = false;break;}}if(!flag){//说明应该判断是不是IPv6String[] split = queryIP.split(":", -1);if(split.length != 8)return "Neither";for (String s : split) {if(s.length() > 4 || s.isEmpty())return "Neither";for (char c : s.toCharArray()) {if(!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))return "Neither";}}return "IPv6";}else {//说明应该判断是不是IPv4String[] split = queryIP.split("\\.", -1);if(split.length != 4)return "Neither";for (String s : split) {if(s.isEmpty())return "Neither";try {int num = Integer.parseInt(s);if(num > 255 || !String.valueOf(num).equals(s))return "Neither";} catch (NumberFormatException e){return "Neither";}}return "IPv4";}}
}
总结:
该题解提供了验证IP地址(IPv4/IPv6)的方法。主要思路是:首先检测分隔符(.或:)确定验证类型。IPv6需满足8段,每段1-4位16进制字符;IPv4需满足4段,每段0-255且无前导零。通过split分隔字符串并逐一验证各分段,使用异常处理转换数字格式。时间复杂度O(n),空间复杂度O(n)。