LeetCode 180 連續出現的數字

2022-09-17 13:24:12 字數 2757 閱讀 1387

編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。

+----+-----+

| id | num |

+----+-----+

| 1 | 1 |

| 2 | 1 |

| 3 | 1 |

| 4 | 2 |

| 5 | 1 |

| 6 | 2 |

| 7 | 2 |

+----+-----+

例如,給定上面的logs表, 1 是唯一連續出現至少三次的數字。

+-----------------+

| consecutivenums |

+-----------------+

| 1 |

+-----------------+

先總結方法:

使用自連線,3個表連線;(如果連續出現1000次,這個方法就不行了。。)

使用oracle視窗函式;

使用mysql變數的方式;

一開始看的時候,毫無頭緒。。

解法一粗略的看了下解答,用自連線的方法,嘗試了下,居然通過了。

---- oracle ----

/* write your pl/sql query statement below */

select distinct a.num as consecutivenums

from logs a,

logs b,

logs c

where a.id = b.id + 1

and a.id = c.id + 2

and a.num = b.num

and a.num = c.num --- 806ms

考慮如果id不連續出現的情況,則需要在資料表中插入一列新的id自增資料進行標識。

解法二由於要獲取至少連續3次出現的數字,看到這個題肯定是會變的,如果是至少連續出現4次(100次),連線4個表(連線1000個)?這種方法肯定是不可取的。

找規律,找出這連續起來的數字有什麼規律呢?發現連續的數字是相同的數字,但是id有可能不是連續的,我們就需要通過對結果集進行再次編號,讓其變成連續的。

首先我們獲取到對每條資料編號從1開始使用row_number()函式使用id來排序。

然後我們通過另一種方式排序將這些num值一樣的進行排序,然後對其編號同樣使用row_bumber()使用num來分組使用id排序over(partition by num order by id)

通過3、4步驟,兩個相減之後我們可以得到,只要是相等的,則相減的值是一樣的。而且如果不連續的話相減值也不一樣。

最後再通過numrn兩個共同分組找到一樣的一共有幾個,就可以找到連續的了。

最終**為:

---- oracle ----

/* write your pl/sql query statement below */

select distinct num as consecutivenums

from

( select num,

rn,count(id) as cnt

from

(

select id,

num,

row_number() over(order by id) - row_number() over(partition by num order by id) as rn

from logs

) group by num, rn

) where cnt >= 3; ---- 1414ms 好慢

想了想,會不會存在num + rn誤判的情況?因為一直遞增,貌似不會。

解法三使用2個變數進行統計。

---- mysql ----

select distinct t.num as consecutivenums

from

( select a.num,

@cnt := if(@pre = a.num, @cnt + 1, 1) cnt,

@pre := a.num pre

from logs a,

(select @pre := null,

@cnt := 0) b

) twhere t.cnt >= 3; ---- 179ms

判斷當前num與上乙個num是否一致,如果是cnt加一,如果不是,重新計數。

高明!聯想到以前自己的乙個奇思妙想:賭錢!押大還是押小,買定離手!

買1塊錢大,贏了的話,繼續買;

輸了的話,買2塊錢大;

贏了的話,恢復買1塊,輸了的話,買4塊錢大;

以此迴圈

設定上限,直到128塊就認輸,止損。

當時想到這個做法的時候,問自己,如果我有較多的資金的話,假設我有1w,那一直買,買到8192的時候,已經是2的13次方了。。不可能連續輸了13次吧。。當時這麼想。。

後來,覺得連續開13次小還是有概率的,想用程式隨機模擬一下輸贏的概率。。但是拖延症上身,一直沒有去實踐。。

今天這道題,嘗試一下吧。。

Leetcode 180 連續出現的數字

詳細見 leetcode 題目總結 sql 編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。id num 1 1 2 1 3 1 4 2 5 1 6 2 7 2 例如,給定上面的 logs 表,1 是唯一連續出現至少三次的數字。consecutivenums 1 create table i...

LeetCode 180 連續出現的數字

題目 編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。返回的結果表中的資料可以按 任意順序 排列。表 logs column name type id int num varchar id是這個表的主鍵返回如下結果 id num 1 1 2 1 3 1 4 2 5 1 6 2 7 2 新增表...

leetcode解題小記180 連續出現的數字

連續出現的數字 sql架構 編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。id num 1 1 2 1 3 1 4 2 5 1 6 2 7 2 例如,給定上面的 logs 表,1 是唯一連續出現至少三次的數字。consecutivenums 1 行與行之間的關係,又是 連續 考慮用lag ...