↓快轉到主要內容
  1. LeetCode/

LeetCode 596: Classes With at Least 5 Students

·1 分鐘· ·
LeetCode Easy Database
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2021-10-10

  • 提交紀錄:Wrong Answer ×3 → Runtime Error → Wrong Answer → Accepted

解題思路
#

跟 LC 182 一樣是對分組下條件(SQL 模板四):GROUP BY class 加 HAVING ... >= 5。數的是不同的學生,COUNT(DISTINCT student),同一個學生重複出現不能算兩次。現在的題目 (student, class) 是主鍵,COUNT(*) 也對,但 DISTINCT 比較保險。

我的嘗試
#

這題提交了 6 次,問題都在「重複的列」:

  • 前幾版用 COUNT(class),2021 年當時的測資裡同一個學生在同一個班級出現了不只一次,被重複計算了;第一版還用了 SELECT *。
  • 想用 FROM distinct(courses) 去重是錯的語法(RE)。
  • 最後改成在子查詢裡算 COUNT(DISTINCT student)、外層再過濾 >= 5 才 AC;直接寫在 HAVING 裡也可以,不需要子查詢。

正確解法
#

SELECT class
FROM Courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5;

複雜度
#

分組 O(n) 或 O(n log n)。

要特別避免的錯誤
#

  • SELECT * 搭配 GROUP BY 在嚴格模式會出錯,只選分組的欄位。
  • 數不同的學生用 COUNT(DISTINCT student)。

面試口說整理
#

我按 class 分組,用 HAVING 留下不同學生數至少五個的班級。用 COUNT DISTINCT 可以避免同一個學生重複出現被算兩次。

相關文章

LeetCode 197: Rising Temperature
·1 分鐘
LeetCode Easy Database
LeetCode 197 解題筆記:Weather self join,條件是兩天的日期差 1 天而且今天比較熱;日期要用 DATEDIFF 比,不能比 id
LeetCode 595: Big Countries
·1 分鐘
LeetCode Easy Database
LeetCode 595 解題筆記:面積至少 300 萬或人口至少 2500 萬,用 WHERE 加 OR 過濾
LeetCode 620: Not Boring Movies
·1 分鐘
LeetCode Easy Database
LeetCode 620 解題筆記:id 是奇數而且 description 不是 boring,按 rating 由高到低排序
LeetCode 175: Combine Two Tables
·1 分鐘
LeetCode Easy Database
LeetCode 175 解題筆記:沒有地址的人也要出現,所以用 LEFT JOIN,對不到的 city、state 會是 NULL
LeetCode 181: Employees Earning More Than Their Managers
·1 分鐘
LeetCode Easy Database
LeetCode 181 解題筆記:Employee 跟自己 self join,用 managerId = id 把員工和主管接起來,再比較薪水
LeetCode 182: Duplicate Emails
·1 分鐘
LeetCode Easy Database
LeetCode 182 解題筆記:按 email 分組,HAVING COUNT(*) > 1 留下出現超過一次的