跳至主要內容

1517. 查找拥有有效邮箱的用户


1517. 查找拥有有效邮箱的用户

🟢   🔖  数据库  🔗 力扣open in new window LeetCodeopen in new window

题目

Table: Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |
+---------------+---------+

user_id is the primary key (column with unique values) for this table.

This table contains information of the users signed up in a website. Some e-mails are invalid.

Write a solution to find the users who have valid emails.

A valid e-mail has a prefix name and a domain where:

  • The prefix name is a string that may contain letters (upper or lower case), digits, underscore '_', period '.', and/or dash '-'. The prefix name must start with a letter.
  • The domain is '@leetcode.com'.

Return the result table in any order.

The result format is in the following example.

Example 1:

Input:

Users table:

+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 2       | Jonathan  | jonathanisgreat         |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
| 5       | Marwan    | quarz#2020@leetcode.com |
| 6       | David     | david69@gmail.com       |
| 7       | Shapiro   | .shapo@leetcode.com     |
+---------+-----------+-------------------------+

Output:

+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
+---------+-----------+-------------------------+

Explanation:

The mail of user 2 does not have a domain.

The mail of user 5 has the # sign which is not allowed.

The mail of user 6 does not have the leetcode domain.

The mail of user 7 starts with a period.

题目大意

表: Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |
+---------------+---------+

user_id 是该表的主键(具有唯一值的列)。

该表包含了网站已注册用户的信息。有一些电子邮件是无效的。

编写一个解决方案,以查找具有有效电子邮件的用户。

一个有效的电子邮件具有前缀名称和域,其中:

  1. 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。前缀名称 必须 以字母开头。
  2. '@leetcode.com'

以任何顺序返回结果表。

结果的格式如以下示例所示:

示例 1:

输入:

Users 表:

+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 2       | Jonathan  | jonathanisgreat         |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
| 5       | Marwan    | quarz#2020@leetcode.com |
| 6       | David     | david69@gmail.com       |
| 7       | Shapiro   | .shapo@leetcode.com     |
+---------+-----------+-------------------------+

输出:

+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
+---------+-----------+-------------------------+

解释:

用户 2 的电子邮件没有域。

用户 5 的电子邮件带有不允许的 '#' 符号。

用户 6 的电子邮件没有 leetcode 域。

用户 7 的电子邮件以点开头。

解题思路

MySQL

  1. 返回字段
    使用 SELECT 返回表中的 user_idnamemail 字段。

  2. 电子邮件有效性检查

    • 检查前缀
      • 使用 REGEXP 检查电子邮件的前缀是否以字母开头,并且只包含允许的字符:[a-zA-Z0-9._-]
    • 检查域
      • 确保电子邮件的域为 @leetcode.com
    • 条件组合:WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\\.com$',这里 ^ 表示开始,$ 表示结束,@leetcode\\.com 用于匹配域。

复杂度分析

  • 时间复杂度O(n),假设表中有 n 条记录,REGEXP 操作需要对每条记录进行匹配。
  • 空间复杂度:SQL 查询本身不占用额外空间,返回的结果占用的空间与记录数成正比。

Pandas

  1. 加载数据
    Users 表加载到 Pandas 的 DataFrame 中。

  2. 电子邮件有效性检查

    • 使用正则表达式检查电子邮件格式:
      • ^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\\.com$ 匹配有效的电子邮件。
    • 利用 Pandas 的 str.match() 方法筛选满足条件的记录并返回。

代码

MySQL
SELECT user_id, name, mail
FROM Users
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\\.com$';