編寫乙個 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步驟,兩個相減之後我們可以得到,只要是相等的,則相減的值是一樣的。而且如果不連續的話相減值也不一樣。
最後再通過num
和rn
兩個共同分組找到一樣的一共有幾個,就可以找到連續的了。
最終**為:
---- 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 ...