1517. 查找拥有有效邮箱的用户
1517. 查找拥有有效邮箱的用户
题目
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 是该表的主键(具有唯一值的列)。
该表包含了网站已注册用户的信息。有一些电子邮件是无效的。
编写一个解决方案,以查找具有有效电子邮件的用户。
一个有效的电子邮件具有前缀名称和域,其中:
- 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线
'_'
,点'.'
和/或破折号'-'
。前缀名称 必须 以字母开头。 - 域 为
'@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
返回字段:
使用SELECT
返回表中的user_id
、name
和mail
字段。电子邮件有效性检查:
- 检查前缀:
- 使用
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
加载数据:
将Users
表加载到 Pandas 的DataFrame
中。电子邮件有效性检查:
- 使用正则表达式检查电子邮件格式:
^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\\.com$
匹配有效的电子邮件。
- 利用 Pandas 的
str.match()
方法筛选满足条件的记录并返回。
- 使用正则表达式检查电子邮件格式:
代码
SELECT user_id, name, mail
FROM Users
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\\.com$';
import pandas as pd
def valid_emails(users: pd.DataFrame) -> pd.DataFrame:
# 定义有效的邮箱正则表达式
regexp = r"^[a-zA-Z][a-zA-Z0-9._-]*@leetcode\.com$"
# 筛选符合条件的记录
return users[users['mail'].str.match(regexp)]