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

Posted 呆呆敲代码的小Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法千题案例每日一练LeetCode打卡——108.独特的电子邮件地址相关的知识,希望对你有一定的参考价值。


📢前言

🚀 算法题 🚀
  • 🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜
  • 🌲 提示:本专栏解题 编程语言一律使用 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 两种编程语言进行解题
  • 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
  • 那今天的算法题分享到此结束啦,明天再见!

以上是关于算法千题案例每日一练LeetCode打卡——108.独特的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

算法千题案例每日一练LeetCode打卡——107.重塑矩阵

算法千题案例每日一练LeetCode打卡——110.种花问题

算法千题案例每日一练LeetCode打卡——109.分糖果

算法千题案例每日一练LeetCode打卡——110.种花问题

算法千题案例每日一练LeetCode打卡——109.分糖果

算法千题案例每日一练LeetCode打卡——105.仅仅反转字母