「LeetCode」929-独特的电子邮件地址

122 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

一.题目:

929. 独特的电子邮件地址 每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成,以 '@' 符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 '.' 或 '+' 。

  • 例如,在 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] 都包含有且仅有一个 '@' 字符
  • 所有本地名和域名都不为空
  • 本地名不会以 '+' 字符作为开头

二、思路分析:

这道题目随便是简单难度的题目,但是如果我们通过看文字答题的时候很容易就被这么多的文字给绕晕了,仔细审题抓住题目的关键点是我们答题的最好办法,首先我从题目中就读到了如下的信息:1.区别了本地名域名; 2.本地名的句点符号对本地名没有影响,相当于可以忽略,而域名不可以; 3.本地名的+号能够直接忽略掉+后面的所有本地名的字符,不适用与域名。了解了这些信息,解题步骤为:

  • 首先我们要能够快速让所有email进行比对,所以使用set数据结构最佳可以自动帮我们过滤重复
  • set数据结构添加的就是本地名的+之前的所有字符串不包括句点加上@右边的所有字符
  • 利用set的自动去重功能,最后的结果我们只需要直接返回size即可。

三、代码:

function numUniqueEmails(emails: string[]): number {
    let set = new Set<string>();
    emails.forEach(item => {
        let mid: number = item.indexOf('@');
        let left:string = item.slice(0 , mid);
        let right: string = item.slice(mid);
        if(left.indexOf('+') !== -1){
            left = left.slice(0 , left.indexOf('+'));
        }
        set.add(left.split('.').join('') + right);
    })
    return set.size;
};

四、总结:

这是每日一题的题目,觉得很有意思就试着解答一下。我们通常看见文字这么多的时候要学会抓住文中的关键点,然后利用关键点进行作答。