返回介绍

solution / 1800-1899 / 1811.Find Interview Candidates / README_EN

发布于 2024-06-17 01:03:14 字数 5145 浏览 0 评论 0 收藏 0

1811. Find Interview Candidates

中文文档

Description

Table: Contests

+--------------+------+
| Column Name  | Type |
+--------------+------+
| contest_id   | int  |
| gold_medal   | int  |
| silver_medal | int  |
| bronze_medal | int  |
+--------------+------+
contest_id is the column with unique values for this table.
This table contains the LeetCode contest ID and the user IDs of the gold, silver, and bronze medalists.
It is guaranteed that any consecutive contests have consecutive IDs and that no ID is skipped.

 

Table: Users

+-------------+---------+
| Column Name | Type  |
+-------------+---------+
| user_id   | int   |
| mail    | varchar |
| name    | varchar |
+-------------+---------+
user_id is the column with unique values for this table.
This table contains information about the users.

 

Write a solution to report the name and the mail of all interview candidates. A user is an interview candidate if at least one of these two conditions is true:

  • The user won any medal in three or more consecutive contests.
  • The user won the gold medal in three or more different contests (not necessarily consecutive).

Return the result table in any order.

The result format is in the following example.

 

Example 1:

Input: 
Contests table:
+------------+------------+--------------+--------------+
| contest_id | gold_medal | silver_medal | bronze_medal |
+------------+------------+--------------+--------------+
| 190    | 1      | 5      | 2      |
| 191    | 2      | 3      | 5      |
| 192    | 5      | 2      | 3      |
| 193    | 1      | 3      | 5      |
| 194    | 4      | 5      | 2      |
| 195    | 4      | 2      | 1      |
| 196    | 1      | 5      | 2      |
+------------+------------+--------------+--------------+
Users table:
+---------+--------------------+-------+
| user_id | mail         | name  |
+---------+--------------------+-------+
| 1     | sarah@leetcode.com | Sarah |
| 2     | bob@leetcode.com   | Bob   |
| 3     | alice@leetcode.com | Alice |
| 4     | hercy@leetcode.com | Hercy |
| 5     | quarz@leetcode.com | Quarz |
+---------+--------------------+-------+
Output: 
+-------+--------------------+
| name  | mail         |
+-------+--------------------+
| Sarah | sarah@leetcode.com |
| Bob   | bob@leetcode.com   |
| Alice | alice@leetcode.com |
| Quarz | quarz@leetcode.com |
+-------+--------------------+
Explanation: 
Sarah won 3 gold medals (190, 193, and 196), so we include her in the result table.
Bob won a medal in 3 consecutive contests (190, 191, and 192), so we include him in the result table.
  - Note that he also won a medal in 3 other consecutive contests (194, 195, and 196).
Alice won a medal in 3 consecutive contests (191, 192, and 193), so we include her in the result table.
Quarz won a medal in 5 consecutive contests (190, 191, 192, 193, and 194), so we include them in the result table.

 

Follow up:

  • What if the first condition changed to be "any medal in n or more consecutive contests"? How would you change your solution to get the interview candidates? Imagine that n is the parameter of a stored procedure.
  • Some users may not participate in every contest but still perform well in the ones they do. How would you change your solution to only consider contests where the user was a participant? Suppose the registered users for each contest are given in another table.

Solutions

Solution 1

# Write your MySQL query statement below
WITH
  S AS (
    SELECT contest_id, gold_medal AS user_id, 1 AS type
    FROM Contests
    UNION
    SELECT contest_id, silver_medal AS user_id, 2 AS type
    FROM Contests
    UNION
    SELECT contest_id, bronze_medal AS user_id, 3 AS type
    FROM Contests
  ),
  T AS (
    SELECT
      user_id,
      (
        contest_id - ROW_NUMBER() OVER (
          PARTITION BY user_id
          ORDER BY contest_id
        )
      ) AS diff
    FROM S
  ),
  P AS (
    SELECT user_id
    FROM S
    WHERE type = 1
    GROUP BY user_id
    HAVING COUNT(1) >= 3
    UNION
    SELECT DISTINCT user_id
    FROM T
    GROUP BY user_id, diff
    HAVING COUNT(1) >= 3
  )
SELECT name, mail
FROM
  P AS p
  LEFT JOIN Users AS u ON p.user_id = u.user_id;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文