🧮 Algorithm Notebook
1、算法准备
1.1 牛客网编程OJ的典型输入输出
2、算法框架
2.1 动态规划
2.1.1 斐波那契数列
2.1.2 背包问题
2.1.3 贪心算法
2.1.4 序列和数组类问题
2.1.5 编辑距离
2.1.6 高楼扔鸡蛋
2.1.7 股票问题系列通解
2.1.8 最长有效括号
2.1.9 剪绳子
2.1.10 正则表达式匹配
2.2 二分查找
2.2.1 二分查找框架
2.2.2 搜索旋转排序数组
2.3 链表
2.3.1 反转链表
2.3.2 相交链表
2.3.3 合并链表
2.3.4 链表中倒数第k个节点
2.3.5 复制带随机指针的链表
2.4 排序算法
2.4.1 常见排序算法
2.5 二叉树
2.5.1 二叉树遍历
2.5.2 岛屿问题
2.5.3 二叉树路径问题
2.5.4 构造二叉树
2.6 回溯算法
2.6.1 回溯算法解题框架
2.6.2 N皇后
2.7 数组
2.7.1 删除有序数组中的重复项
2.7.2 滑动窗口最大值
2.7.3 调整数组顺序使奇数位于偶数前面
2.7.4 螺旋矩阵
2.7.5 多数元素
2.7.6 最大数
2.7.7 和为s的两个数字
2.7.8 构建乘积数组
2.7.9 两数之和
2.8 字符串
2.8.1 最小覆盖子串
2.8.2 比较版本号
2.8.3 验证IP地址
2.8.4 基本计算器 II
2.8.5 字符串解码
2.8.6 移掉 K 位数字
2.8.7 无重复字符的最长子串
2.8.8 第一个只出现一次的字符
2.8.9 翻转字符串里的单词
2.8.10 字符串转换整数 (atoi)
2.8.11 字符串四则运算
2.9 栈
2.9.1 最小栈
2.9.2 弹出序列
2.10 数学
2.10.1 用 Rand7() 实现 Rand10()
2.10.2 只出现一次的数字
2.10.3 整数反转
2.10.4 求1+2+…+n
2.10.5 二进制中1的个数
2.10.6 幂运算
2.10.7 1~n 整数中 1 出现的次数
2.10.8 数字序列中某一位的数字
2.10.9 丑数
2.10.10 n个骰子的点数
2.10.11 圆圈中最后剩下的数字
2.10.12 不用加减乘除做加法
2.10.13 x 的平方根
2.11 设计
2.11.1 LRU 缓存机制
-
+
游客
注册
登录
验证IP地址
## 1 题目 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。 如果是有效的 IPv4 地址,返回 "IPv4" ; 如果是有效的 IPv6 地址,返回 "IPv6" ; 如果不是上述类型的 IP 地址,返回 "Neither" 。 IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1; 同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。 IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address 地址 (即,忽略 0 开头,忽略大小写)。 然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。 同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。 **示例 1:** ```txt 输入:IP = "172.16.254.1" 输出:"IPv4" 解释:有效的 IPv4 地址,返回 "IPv4" ``` **示例 2:** ```txt 输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334" 输出:"IPv6" 解释:有效的 IPv6 地址,返回 "IPv6" ``` **示例 3:** ```txt 输入:IP = "256.256.256.256" 输出:"Neither" 解释:既不是 IPv4 地址,又不是 IPv6 地址 ``` **示例 4:** ```txt 输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334:" 输出:"Neither" ``` **示例 5:** ```txt 输入:IP = "1e1.4.5.6" 输出:"Neither" ``` **提示:** * IP 仅由英文字母,数字,字符 '.' 和 ':' 组成。 ## 2 问题分析 1. **IPv4 判断标准**: 1. **通过 `.` 分割后的长度必须为 4**。 2. **每一段的长度必须在 1 到 3 之间**。 3. **每一段的长度大于 1 时,不能包含前导 0**。 4. **每一段都必须是数字**。 2. **IPv6 判断标准**: 1. **通过 `:` 分割后的长度必须为 8**。 2. **每一段的长度必须在 1 到 4 之间**。 3. **每一段的字符都必须在 `0123456789abcdefABCDEF` 里面**。 3. 需要注意的是: 1. `public String[] split(String regex, int limit)`: 1. 该方法主要**根据匹配给定的正则表达式来拆分此字符串**。 2. 该方法**返回的数组包含此字符串的子字符串**,**每个字符串都由另一个匹配给定表达式的子字符串终止**,**或者由此字符串末尾终止**,**数组中的子字符串按他们在此字符串中出现的顺序排列**,**如果表达式不匹配输入的任何部分**,**那么所得数组只具有一个元素**,**即此字符串**。 3. `limit`参数**控制模式应用的次数**,因而**影响所得数组的长度**: 1. **如果$limit \gt 0$**,则**模式最多被应用$limit - 1$次**,**数组的长度将不会大于$limit$**,而且**数组的最后一项将包含所有超出最后匹配的定界符的输入**。 2. **如果$limit \lt 0$**,那么**模式将被应用尽可能多的次数**,而且**数组可以是任何长度**。 3. **如果$limit = 0$**,那么**模式将被应用尽可能多的次数**,而且**数组可以是任何长度**,并且**结尾空字符串将被丢弃**。 4. 具体实例如下: 1. 假如有一个字符串`boo:and:foo`,使用这些参数可以生成以下结果:![](/media/202111/2021-11-14_221925_952904.png) ## 3 参考代码 ```java /** * 468. 验证 IP 地址 * @param queryIP 输入的字符串 * @return 验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 */ public String validIPAddress(String queryIP) { if (queryIP.contains(".")) {return validateIPv4(queryIP);} else if (queryIP.contains(":")) {return validateIPv6(queryIP);} return "Neither"; } /** * 验证输入的字符串是否是有效的 IPv4 地址 * @param queryIP 输入的字符串 * @return 验证输入的字符串是否是有效的 IPv4 地址 */ public String validateIPv4(String queryIP) { String[] split = queryIP.split("\\.", -1); if (split.length != 4) {return "Neither";} for (String str: split) { if (str.length() == 0 || str.length() > 3) {return "Neither";} if (str.charAt(0) == '0' && str.length() != 1) {return "Neither";} for (char c: str.toCharArray()) { if (!Character.isDigit(c)) {return "Neither";} } if (Integer.parseInt(str) > 255) {return "Neither";} } return "IPv4"; } /** * 验证输入的字符串是否是有效的 IPv6 地址 * @param queryIP 输入的字符串 * @return 验证输入的字符串是否是有效的 IPv6 地址 */ public String validateIPv6(String queryIP) { String[] split = queryIP.split(":", -1); String hexdigits = "0123456789abcdefABCDEF"; if (split.length != 8) {return "Neither";} for (String str: split) { if (str.length() == 0 || str.length() > 4) {return "Neither";} for (char c: str.toCharArray()) { if (hexdigits.indexOf(c) == -1) {return "Neither";} } } return "IPv6"; } ``` ## 参考文献 1. [468. 验证 IP 地址](https://leetcode-cn.com/problems/validate-ip-address)。 2. [验证 IP 地址](https://leetcode-cn.com/problems/validate-ip-address/solution/yan-zheng-ip-di-zhi-by-leetcode)。
ricear
2021年11月14日 22:19
©
BY-NC-ND(4.0)
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码