zoukankan      html  css  js  c++  java
  • LeetCode.927-独特邮箱地址(Unique Email Addresses)

    这是悦乐书的第356次更新,第383篇原创

    01看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第218题(顺位题号是927)。每封电子邮件都包含本地名称和域名,以@符号分隔。

    例如,在alice@leetcode.com中,alice是本地名称,leetcode.com是域名。

    除了小写字母,这些电子邮件可能包含'.''+'

    如果在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'),则在那里发送的邮件将转发到本地名称中没有点的同一地址。例如,“alice.z@leetcode.com”“alicez@leetcode.com”转发到同一个电子邮件地址。(请注意,此规则不适用于域名。)

    如果在本地名称中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如m.y+name@email.com将转发到my@email.com。(同样,此规则不适用于域名。)

    可以同时使用这两个规则。

    给定电子邮件列表,我们会向列表中的每个地址发送一封电子邮件。有多少不同的地址实际接收邮件?例如:

    输入:[“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”实际收到邮件
    

    注意

    • 1 <= emails[i].length <= 100

    • 1 <= emails.length <= 100

    • 每封emails[i]都包含一个'@'字符。

    • 所有本地名称和域名都是非空的。

    • 本地名称不以“+”字符开头。

    02 第一种解法

    根据题目给的规则,对字符串分两段处理,在本地名称中,如果存在+号,就截取+号前的字符串,变成新的本地名称,如果遇到点号,就将点号全部替换,得到新的本地名称,再和域名部分拼接在一起,存入HashSet中,返回HashSetsize即可。

    public int numUniqueEmails(String[] emails) {
        Set<String> set = new HashSet<String>();
        for (String email : emails) {
            String tem = email;
            int index = tem.indexOf('@');
            // 截取@之前的字符串
            tem = tem.substring(0, index);
            // 有'+',就再截取'+'号之前的字符串
            if (tem.indexOf('+') > 0) {
                tem = tem.substring(0, tem.indexOf('+'));
            }
            // 将所有点号替换
            tem = tem.replace(".", "");
            // 将@符号前的新字符串和原字符串@符号后的域名拼接
            // 存入HashSet
            set.add(tem+email.substring(index));
        }
        return set.size();
    }
    

    03 第二种解法

    我们也可以不使用字符串截取、替换等方法,直接对字符进行判断,然后拼接成新的email地址,最后存入HashSet中,返回HashSetsize即可。

    public int numUniqueEmails2(String[] emails) {
        Set<String> set = new HashSet<String>();
        for (String email : emails) {
            set.add(handleEmail(email));
        }
        return set.size();
    }
    
    public String handleEmail(String email) {
        StringBuilder sb = new StringBuilder();
        int n = email.length();
        // 是否遇到@符号
        boolean flag = false;
        for (int i=0; i<n; i++) {
            char c = email.charAt(i);
            if (!flag) {
                //没遇到@符号前,遇到.号一律 跳过
                if (c == '.') {
                    continue;
                } 
                //遇到+号,往后跳一位,开始寻找@符号
                if (c == '+') {
                    i++;
                    while (i < n && email.charAt(i) != '@') {
                        i++;
                    }
                    c = email.charAt(i);
                    // 已经遇到@符号
                    flag = true;
                } else if(c == '@'){
                    // 没遇到+号,却遇到@符号了
                    flag = true;
                }
            }
            sb.append(c);
        }
        return sb.toString();
    }
    

    04 小结

    算法专题目前已连续日更超过六个月,算法题文章224+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    深入理解计算机系统cp1:存储单位与编码
    25个JavaScript数组方法代码示例
    中间人攻击,HTTPS也可以被碾压
    用了这么久HTTP, 你是否了解Content-Length?
    C#证明静态方法中的成员在线程之间是独立的
    ASP.NET Core Web API官方文档(链接)
    C#中,隐式转换(implicit)和显式转换(explicit)重载方法,不支持将接口类型作为转换的源类型或目标类型
    ASP.NET Core MVC 和Razor页面中的模型验证(链接)
    C#中JSON字符串中的转义字符
    使用文件流,读写网络共享盘
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/11037792.html
Copyright © 2011-2022 走看看