【LeetCode 題解】數據庫:180. 連續出現的數字

一、問題描述

給定一個Logs表,包含自增 ID 和數字字段:

CREATE TABLE Logs (id INT PRIMARY KEY AUTO_INCREMENT,num VARCHAR(50)
);

要求編寫 SQL 查詢,找出所有至少連續出現三次的數字。例如:

+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
+----+-----+

輸出應為:

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

二、核心思路解析

問題本質

需要識別表中連續出現至少三次的相同數字。關鍵點在于:

  1. 連續條件:相鄰行的num值相同

  2. 次數統計:連續次數≥3 次

  3. 去重需求:相同數字只需返回一次

關鍵技術點

1. 如何判斷連續?
  • 自連接法:通過表自連接比較相鄰行

  • 窗口函數法:使用LAG()獲取前一行數據

2. 如何統計連續次數?
  • 滑動窗口:檢查當前行與前兩行是否相同

  • 狀態標記:用變量記錄當前連續狀態

三、解決方案詳解

方法一:自連接法

實現邏輯

通過三次自連接,將當前行與前兩行進行比較:

SELECT DISTINCT a.num AS ConsecutiveNums
FROM Logs a
JOIN Logs b ON a.id = b.id + 1
JOIN Logs c ON a.id = c.id + 2
WHERE a.num = b.num AND b.num = c.num;
執行流程

以示例數據為例:

  1. 連接條件

  • a.id = b.id + 1?→ 當前行與前一行
  • a.id = c.id + 2?→ 當前行與前兩行
  1. 過濾條件:三個連續行的num相同

  2. 去重處理:使用DISTINCT避免重復結果

方法二:窗口函數法(推薦)

實現邏輯

使用LAG()窗口函數獲取前兩行數據:

SELECT DISTINCT num AS ConsecutiveNums
FROM (SELECT num,LAG(num, 1) OVER (ORDER BY id) AS prev1,LAG(num, 2) OVER (ORDER BY id) AS prev2FROM Logs
) AS sub
WHERE num = prev1 AND prev1 = prev2;
執行流程
  1. 子查詢

  • LAG(num, 1)獲取前一行的num
  • LAG(num, 2)獲取前兩行的num
  1. 過濾條件:當前行與前兩行num相同

  2. 去重處理:使用DISTINCT確保唯一結果

四、兩種方法對比

維度自連接法窗口函數法
代碼復雜度★★★☆☆★★☆☆☆
執行效率低(需三次表掃描)高(單次掃描)
可讀性較低(需理解自連接邏輯)高(直觀的前向引用)
適用場景舊版本數據庫(如 MySQL 5.x)現代數據庫(MySQL 8.0+)

推薦場景

  • 優先使用窗口函數法(簡潔高效)

  • 若數據庫不支持窗口函數,使用自連接法

五、擴展優化

動態處理任意連續次數

將固定的 3 次改為變量N

CREATE FUNCTION getConsecutiveNums(N INT) RETURNS TABLE
RETURN
SELECT DISTINCT num AS ConsecutiveNums
FROM (SELECT num,LAG(num, 1) OVER (ORDER BY id) AS prev1,LAG(num, 2) OVER (ORDER BY id) AS prev2FROM Logs
) AS sub
WHERE num = prev1 AND prev1 = prev2;

處理更長連續次數

對于連續 5 次的情況,只需增加更多LAG()調用:

SELECT DISTINCT num
FROM (SELECT num,LAG(num, 1) OVER (ORDER BY id) AS prev1,LAG(num, 2) OVER (ORDER BY id) AS prev2,LAG(num, 3) OVER (ORDER BY id) AS prev3,LAG(num, 4) OVER (ORDER BY id) AS prev4FROM Logs
) AS sub
WHERE num = prev1 AND prev1 = prev2 AND prev2 = prev3 AND prev3 = prev4;

六、測試用例驗證

測試用例 1:正常情況

輸入

INSERT INTO Logs (num) VALUES
('1'),('1'),('1'),('2'),('1'),('2'),('2');

預期輸出

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

測試用例 2:多個連續數字

輸入

INSERT INTO Logs (num) VALUES
('5'),('5'),('5'),('5'),('3'),('3'),('3');

預期輸出

+-----------------+
| ConsecutiveNums |
+-----------------+
| 5               |
| 3               |
+-----------------+

測試用例 3:邊界情況

輸入

INSERT INTO Logs (num) VALUES
('a'),('a'),('a'),('a');

預期輸出

+-----------------+
| ConsecutiveNums |
+-----------------+
| a               |
+-----------------+

七、常見問題解答

Q:為什么需要使用DISTINCT
A:防止同一數字多次出現在結果中(例如連續 4 次會產生兩條記錄)。

Q:如果連續次數超過 3 次會怎樣?
A:會被正確識別,因為只要存在至少連續 3 次即可。

Q:如何處理非常大的表?
A:為id字段添加索引,提升窗口函數性能。

八、總結

  • 核心邏輯:通過比較當前行與前兩行的值,判斷是否連續相同。

  • 關鍵技巧

    • 自連接法:適用于所有數據庫版本

    • 窗口函數法:簡潔高效,推薦使用

  • 擴展應用

    • 動態處理任意連續次數

    • 處理更復雜的業務場景(如連續登錄天數)

感謝各位的閱讀,后續將持續給大家講解力扣中的算法題和數據庫題,如果覺得這篇內容對你有幫助,別忘了點贊和關注,后續還有更多精彩的算法解析與你分享!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74253.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MaxEnt模型進階:基于R語言自動化與GIS空間建模的物種棲息地精準預測

生物多樣性的空間分布規律及其對環境變化的響應機制,是生態學與地理學研究的前沿議題。在氣候變化加劇和人類活動干擾的雙重壓力下,如何精準預測物種潛在分布范圍、識別關鍵環境驅動因子,已成為制定生物保護策略的核心科學問題。物種分布模型…

緩存雪崩解決方案:二級緩存VS隨機TTL

背景 在學習緩存雪崩的時候,了解到有二級緩存和隨機TTL兩個解決方案,但是在學習之后,個人認為二級緩存本質上還是利用兩層緩存的過期時間不一致來實現緩存過期時間隨機化,這不就是和隨機TTL一樣嗎,故有了這篇思考&…

Android View事件分發機制深度解析

在Android面試中,關于View事件分發機制的考察往往不僅限于基礎流程,更關注底層原理、性能優化和實際應用場景。以下是針對面試的全面回答策略: 一、基礎回答框架 核心三要素: 傳遞流程 "事件分發遵循Activity → Window →…

2829. k-avoiding 數組的最小總和

2829. k-avoiding 數組的最小總和 題目鏈接:2829. k-avoiding 數組的最小總和 代碼如下: class Solution { public:int minimumSum(int n, int k) {int m min(k / 2, n);return (m * (m 1) (k * 2 n - m - 1) * (n - m)) / 2;} };

phpStorm2021.3.3在windows系統上配置Xdebug調試

開始 首先根據PHP的版本下載并安裝對應的Xdebug擴展在phpStorm工具中找到設置添加服務添加php web page配置完信息后 首先根據PHP的版本下載并安裝對應的Xdebug擴展 我使用的是phpStudy工具,直接在php對應的版本中開啟xdebug擴展, 并在php.ini中添加如下…

LabVIEW永磁同步電機性能測試系統

開發了一種基于LabVIEW的永磁同步電機(PMSM)性能測試系統的設計及應用。該系統針對新能源汽車使用的電機進行穩態性能測試,解決了傳統測試方法成本高、效率低的問題,實現了測試自動化,提高了數據的準確性和客觀性。 ?…

谷粒商城:Redisson

目錄 Redisson 整合Redisson RLock RReadWriteLock RSemaphore RCountDownLatch 優化三級分類緩存 緩存一致性問題 雙寫模式 失效模式 臟數據解決 Redisson 提供redis分布式鎖(Distributed locks with Redis)的java客戶端 整合Redisson 引入 …

Linux系統調用編程

目錄 一. 理解進程和線程的概念。并在Linux系統下進行相應操作 1.1概念 1.1.1進程(Process) 1.1.2 線程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系統中各進程的編號pid 1.2.2用kill 命令終止一個進程pid 二. 解釋Linux的“虛擬內存管理”,它與stm32中的 真…

25-智慧旅游系統(協同算法)三端

介紹 技術: 基于 B/S 架構 SpringBootMySQLLayuivue 環境: Idea mysql maven jdk1.8 node 管理端功能 首頁展示圖表:以數據可視化方式展示關鍵業務數據。 用戶管理:管理系統用戶,包括查看、編輯等操作。 供應商管…

【stm32--HAL庫DMA+USART+空閑中斷不定長收發數據】

串口通信-Hal庫實現不定長度收發,DMAUSART DMA串口STM32CUBEMX配置(工程創建)基礎配置時鐘配置工程配置 代碼編寫現象 DMA 在正式配置之前,我們先來一起簡單了解一下DMA。DMA(Direct Memory Access,直接內…

沉浸式體驗測評|AI Ville:我在Web3小鎮“生活”了一周

最近,我在朋友的推薦下,體驗了 aivillebot 的項目。起初,我只是抱著試試看的心態,心想這不就是個 Web3 版的《星露谷物語》嗎? 但是一周下來,我發現這個虛擬小鎮也沒那么簡單——里面的居民不是目前端游或鏈…

FPGA學習-基于 DE2-115 板的 Verilog 分秒計數器設計與按鍵功能實現

一、核心功能設計 按鍵暫停/繼續:通過KEY1控制計時狀態 按鍵消抖處理:20ms消抖周期消除機械抖動 硬件資源分配:符合DE2-115開發板引腳規范 二、核心模塊實現詳解 1. 頂層模塊(counter) module counter(input CL…

后端開發 SpringBoot 工程模板

概述 本篇文章主要記錄如何開發一個通用的 SpringBoot 工程開發框架的項目模板,這樣后續需要開發項目時就可以直接開箱直用了,省區了很多重復步驟。 項目初始化 創建項目: 按照我的選項來選,然后點擊 create,等待文…

OpenCv(五)——邊緣檢測

目錄 邊緣檢測 一、sobel算子邊緣檢測 (1)原理 1、X軸方向的邊緣檢測 2、Y軸方向的邊緣檢測 (2)sobel算子參數 (3)X軸方向邊緣檢測代碼演示 1、顯示圓的圖像 2、x方向上的邊緣檢測&#xf…

無人機數據鏈技術及運行方式詳解!

一、無人機數據鏈技術要點 1. 通信傳輸技術 頻段選擇: 常用頻段包括 L波段(1-2 GHz)、C波段(4-8 GHz)、Ku/K波段(12-40 GHz),不同頻段在傳輸距離、帶寬和抗干擾性間權衡。 低…

AI Agent 實戰:搭建個人在線旅游助手

AI Agent 實戰:搭建個人在線旅游助手 本次實驗中,我們將繼續探索 Agent 的提示詞,學習更加規范的提示詞撰寫方法。 本實驗中你將掌握的知識點 使用 Dify 構建 Agent 的方法結構化的提示詞撰寫技巧變量的使用方法 1. 準備 在新建 Agent 之…

檢索增強生成(RAG):強化 AI 智能體的知識 “武裝”

技術點目錄 第一章、智能體(Agent)入門第二章、基于字節Coze 構建智能體(Agent)第三章、基于其他平臺構建智能體(Agent)第四章、國內外智能體(Agent)經典案例詳解第五章、大語言模型應用開發框架LangChain入門第六章、基于LangChain的大模型API接入第七章…

vscode 打開工程 看不到文件目錄

vscode 打開工程 看不到文件目錄 View->Explorer 快捷鍵:CtrlShiftE

厘米級定位賦能智造升級:品鉑科技UWB技術驅動工廠全流程自動化與效能躍升”

在智能制造中的核心價值體現在?高精度定位、流程優化、安全管理?等多個維度,具體應用如下: 一、?核心技術與定位能力? ?厘米級高精度定位? UWB技術通過?納秒級窄脈沖信號?(帶寬超500MHz)實現高時間分辨率,結合…

getID3獲取本地或遠程視頻時長

音頻文件也可使用,使用ffmeg安裝太復雜了 附ffmpeg方式:centos下安裝ffmpeg_yum安裝ffmpeg-CSDN博客 使用composer先安裝 composer require james-heinrich/getid3 獲取本地視頻 //獲取本地視頻$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…