3451. 查找无效的 IP 地址
题目描述
表:logs
+-------------+---------+ | Column Name | Type | +-------------+---------+ | log_id | int | | ip | varchar | | status_code | int | +-------------+---------+ log_id 是这张表的唯一主键。 每一行包含服务器访问日志信息,包括 IP 地址和 HTTP 状态码。
编写一个解决方案来查找 无效的 IP 地址。一个 IPv4 地址如果满足以下任何条件之一,则无效:
- 任何 8 位字节中包含大于 255 的数字
- 任何 8 位字节中含有 前导零(如
01.02.03.04
) - 少于或多于
4
个 8 位字节
返回结果表分别以 invalid_count
,ip
降序 排序。
结果格式如下所示。
示例:
输入:
logs 表:
+--------+---------------+-------------+ | log_id | ip | status_code | +--------+---------------+-------------+ | 1 | 192.168.1.1 | 200 | | 2 | 256.1.2.3 | 404 | | 3 | 192.168.001.1 | 200 | | 4 | 192.168.1.1 | 200 | | 5 | 192.168.1 | 500 | | 6 | 256.1.2.3 | 404 | | 7 | 192.168.001.1 | 200 | +--------+---------------+-------------+
输出:
+---------------+--------------+ | ip | invalid_count| +---------------+--------------+ | 256.1.2.3 | 2 | | 192.168.001.1 | 2 | | 192.168.1 | 1 | +---------------+--------------+
解释:
- 256.1.2.3 是无效的,因为 256 > 255
- 192.168.001.1 是无效的,因为有前导零
- 192.168.1 是非法的,因为只有 3 个 8 位字节
输出表分别以 invalid_count
,ip
降序排序。
解法
方法一:模拟
我们可以根据题意,判断 IP 地址是否不合法,判断的条件有:
- IP 地址中的
.
的个数不等于 \(3\); - IP 地址中的某个 octet 以
0
开头; - IP 地址中的某个 octet 大于 \(255\)。
然后我们将不合法的 IP 地址进行分组,并统计每个不合法的 IP 地址的个数 invalid_count
,最后按照 invalid_count
和 ip
降序排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|