当前位置: 首页 > news >正文

SQL-leetcode—3451. 查找无效的 IP 地址

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 是不是四段的,使用 LENGTH(ip) - LENGTH(REPLACE(ip, ‘.’, ‘’)) + 1 != 4
使用 SUBSTRING_INDEX 嵌套,分割出 ip 的每个段
转换数据类型,可通过 + 0 转换成数值类型,判断是否大于 255
通过 RLIKE 正则表达式判断是不是 0 开头,如果是 0 , ^0[0-9]+ 表示前导 0 后面还有至少一个数字

方法一 拆解判断

SELECTip,COUNT(*) AS invalid_count
FROM logs
WHERELENGTH(ip) - LENGTH(REPLACE(ip, '.', '')) + 1 != 4 ORSUBSTRING_INDEX(ip, '.', 1) + 0 > 255 OR SUBSTRING_INDEX(ip, '.', 1) RLIKE '^0[0-9]+'OR SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 2), '.', -1) + 0 > 255 OR SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 2), '.', -1) RLIKE '^0[0-9]+'OR SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 3), '.', -1) + 0 > 255 OR SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 3), '.', -1) RLIKE '^0[0-9]+'OR SUBSTRING_INDEX(ip, '.', -1) + 0 > 255 OR SUBSTRING_INDEX(ip, '.', -1) RLIKE '^0[0-9]+'
GROUP BY ip
ORDER BY invalid_count DESC, ip DESC

方法二 正则

select t.ip,count(1) invalid_countfrom logs twhere concat(t.ip,'.') not regexp-- 1-9  | 10-99    | 100-199 | 200-249   | 250-255'^(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){4}$'group by t.iporder by invalid_count desc,t.ip desc
http://www.xdnf.cn/news/1338067.html

相关文章:

  • 从vue2到vue3
  • C++STL-stack和queue的使用及底层实现
  • 基于单片机教室照明灯控制系统
  • Jenkins+GitLab在CentOS7上的自动化部署方案
  • 新手向:Python 3.12 新特性实战详解
  • PAT 1076 Forwards on Weibo
  • linux 差分升级简介
  • git增加ignore文件
  • 健康常识查询系统|基于java和小程序的健康常识查询系统设计与实现(源码+数据库+文档)
  • UEM终端防御一体化
  • 2026 济南玉米及淀粉深加工展:从原料到创新产品的完整解决方案
  • AI Agent与LLM区别
  • Jmeter接口测试之文件上传
  • QT的项目pro qmake编译
  • 【51单片机学习】AT24C02(I2C)、DS18B20(单总线)、LCD1602(液晶显示屏)
  • Prompt魔法:提示词工程与ChatGPT行业应用读书笔记:提示词设计全能指南
  • 智能制造加速器:某新能源车智慧工厂无线网络优化提升方案
  • 美国联邦调查局警告俄罗斯针对思科设备的网络间谍活动
  • Android APP防止应用被动态调试
  • 无监督学习(聚类 异常检测)
  • 北京JAVA基础面试30天打卡14
  • GO学习记录七——上传/下载文件功能,添加启动运行工具
  • 如何使用Prometheus + Grafana + Loki构建一个现代化的云原生监控系统
  • 20250821日记
  • leetcode 76 最小覆盖子串
  • leetcode-python-349两个数组的交集
  • 如何使用 DeepSeek 助力工作​
  • Seaborn数据可视化实战
  • 审美积累 | 界面设计拆分 | Redesign Health - Services 医疗页面设计
  • 记录一次el-table+sortablejs的拖拽bug