【算法千题案例】每日LeetCode打卡——108.独特的电子邮件地址

举报
呆呆敲代码的小Y 发表于 2022/01/17 16:51:40 2022/01/17
【摘要】 @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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。