likes
comments
collection
share

【刷题日记】929. 独特的电子邮件地址

作者站长头像
站长
· 阅读数 18

本次刷题日记的第 54 篇,力扣题为:929. 独特的电子邮件地址中等

一、题目描述:

【刷题日记】929. 独特的电子邮件地址

来了解一个电子邮件的题目,虽然题目不难,但是也可以普及一下邮件的一些基本知识点

【刷题日记】929. 独特的电子邮件地址

二、这道题考察了什么思想?你的思路是什么?

题目给我们普及了一个关于邮件的基本知识:

  • 邮件字符串的组成部分为 本地名 + @ + 域名
  • 其中本地名如果有 . ,会被直接忽略,若在本地名中有 + ,则 + 后面的到 @ 前的字符串都会被直接忽略掉,当然,也包括 + 也会被直接忽略掉

分析

【刷题日记】929. 独特的电子邮件地址

如上图展示的,当我们了解了邮件字符串的这个基本原理之后,我们处理起来就会非常明确和得心应手了

  • 找到 @ 前的字符串,也就是邮件的本地名,我们可以通过字符串切割的方式来进行处理即可,每一种语言都会有字符串的公共库,除非用 C 语言自己一个字符一个字符的去偏移
  • 处理 . ,处理本地名的时候,同样也是通过字符串的库找到 . 的位置,然后将其替换成空白,相当于去掉这个字符串
  • 处理 + ,同理,在本地名中找到 + 的位置,将其位置到本地名的结束位置涉及的字符串包含 + ,全部干掉即可
  • 最后将处理后的本地名,与原字符串中 @ 后面的字符串拼接起来,就可以找到实际的字符串了

【刷题日记】929. 独特的电子邮件地址

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

上面描述的处理逻辑已经很清楚了,我们重点要注意本地名的 . 和的情况, 和 + 的情况进行分类处理即可,关于计算不同邮件域名的个数,我们可以使用 hash 表来进行处理

编码如下:

func numUniqueEmails(emails []string) int {
    help := map[string]struct{}{}
    for _, e := range emails {

        i := strings.IndexByte(e, '@')

        tmp := strings.SplitN(e[:i], "+", 2)[0]

        tmp = strings.ReplaceAll(tmp, ".", "")  

        help[tmp+e[i:]] = struct{}{}

    }
    return len(help)
}

四、总结:

【刷题日记】929. 独特的电子邮件地址

可以看出我们这种简单实现的方式,时间复杂度与题目给出的 emails 的元素长度有关系,则时间复杂度实际上是 O(N) ,这个 N 指的就是 email 的长度

那么空间复杂度也是 O(N) ,因为咱们开辟了一个 哈希表,占用的空间最大的情况就是哈希表的长度等于 emails 的长度

原题地址:929. 独特的电子邮件地址

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

【刷题日记】929. 独特的电子邮件地址

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

暂时无法在飞书文档外展示此内容