【算法千题案例】每日LeetCode打卡——108.独特的电子邮件地址
【摘要】 @TOC 📢前言 🚀 算法题 🚀 🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!🌲 今天是力扣算法题持续打卡第101天🎈! 🚀 算法题 🚀 🌲原题样例:独特的电子邮件地址每个 有效电子邮件地址 都由一个 ...
@TOC
📢前言
🚀 算法题 🚀 |
- 🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜
- 🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题
- 🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!
- 🌲 今天是力扣算法题持续打卡第101天🎈!
🚀 算法题 🚀 |
🌲原题样例:独特的电子邮件地址
每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 '@'
符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 '.'
或'+'
。
例如,在 alice@leetcode.com
中, alice 是 本地名 ,而 leetcode.com
是 域名
。
如果在电子邮件地址的 本地名 部分中的某些字符之间添加句点('.')
,则发往那里的邮件将会转发到本地名中没有点的同一地址。请注意,此规则 不适用于域名 。
例如,"alice.z@leetcode.com”
和 “alicez@leetcode.com”
会转发到同一电子邮件地址。
如果在 本地名 中添加加号('+')
,则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件。同样,此规则 不适用于域名 。
例如 m.y+name@email.com
将转发到 my@email.com
。
可以同时使用这两个规则。
给你一个字符串数组 emails
,我们会向每个 emails[i]
发送一封电子邮件。返回实际收到邮件的不同地址数目。
示例1:
输入:emails = ["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
输出:2
解释:实际收到邮件的是 "testemail@leetcode.com" 和 "testemail@lee.tcode.com"。
示例2:
输入:emails = ["a@leetcode.com","b@leetcode.com","c@leetcode.com"]
输出:3
提示:
- 1 <= emails.length <= 100
- 1 <= emails[i].length <= 100
- emails[i] 由小写英文字母、’+’、’.’ 和 ‘@’ 组成
- 每个 emails[i] 都包含有且仅有一个 ‘@’ 字符
- 所有本地名和域名都不为空
- 本地名不会以 ‘+’ 字符作为开头
🌻C#方法:规范化表示
代码:
public class Solution {
public int NumUniqueEmails(string[] emails) {
HashSet<string> data = new HashSet<string>();
StringBuilder builder = new StringBuilder();
for(int i=0;i<emails.Length;i++){
builder.Clear();
bool judge = true, plus = true;
for(int j=0;j<emails[i].Length;j++){
bool add = true;
if(judge){
if(emails[i][j]=='+')
{
plus = false;
}
if(emails[i][j]=='@')
{
judge = false;
plus = true;
}
if(emails[i][j]=='.'){
add = false;
}
}
if(add&&plus){
builder.Append(emails[i][j]);
}
}
data.Add(builder.ToString());
}
return data.Count;
}
}
执行结果
通过
执行用时:100 ms,在所有 C# 提交中击败了60.14%的用户
内存消耗:40.9 MB,在所有 C# 提交中击败了95.70%的用户
🌻Java 方法:规范化表示
思路解析
对于每个电子邮件地址,我们求出它的规范化表示(即根据 '.'
和 '+'
的规则进行处理后得到的,本地名称中仅包含小写字母的电子邮件地址)。我们对每一个地址依次进行如下的操作:
- 将电子邮件地址根据
'@'
分成本地名称 local 和域名 reset 两部分,其中域名部分包含 ‘@’,且不需要进行额外的处理; - 如果本地名称中有
'+'
,那么移除 ‘+’ 以及它后面出现的所有字符; - 移除本地名称中的所有
'.'
; - 处理完成的本地名称和域名进行连接,得到电子邮件地址的规范化表示
local + rest
。
在得到了所有电子邮件地址的规范化表示后,我们将它们放入集合(Set
)中,就可以获知不同地址的数目。
代码:
class Solution {
public int numUniqueEmails(String[] emails) {
Set<String> seen = new HashSet();
for (String email : emails) {
int i = email.indexOf('@');
String local = email.substring(0, i);
String rest = email.substring(i);
if (local.contains("+")) {
local = local.substring(0, local.indexOf('+'));
}
// Note: one should escape the specific character '.',
// since it is treated as a regex expression.
local = local.replaceAll("\\.", "");
seen.add(local + rest);
}
return seen.size();
}
}
执行结果
通过
执行用时:1 ms,在所有 Java 提交中击败了76.41%的用户
内存消耗:36.4 MB,在所有 Java 提交中击败了23.53%的用户
复杂度分析
时间复杂度:O( MC )其中 MM 是所有电子邮件中长度最长的长度,CC 是电子邮件地址的数目。
空间复杂度:O(MC)
💬总结
- 今天是力扣算法题打卡的第108天!
- 文章采用
C#
和Java
两种编程语言进行解题 - 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
- 那今天的算法题分享到此结束啦,明天再见!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)