本次刷题日记的第 54 篇,力扣题为:929. 独特的电子邮件地址,中等
一、题目描述:
来了解一个电子邮件的题目,虽然题目不难,但是也可以普及一下邮件的一些基本知识点
二、这道题考察了什么思想?你的思路是什么?
题目给我们普及了一个关于邮件的基本知识:
- 邮件字符串的组成部分为 本地名 +
@
+ 域名 - 其中本地名如果有
.
,会被直接忽略,若在本地名中有+
,则+
后面的到@
前的字符串都会被直接忽略掉,当然,也包括+
也会被直接忽略掉
分析
如上图展示的,当我们了解了邮件字符串的这个基本原理之后,我们处理起来就会非常明确和得心应手了
- 找到
@
前的字符串,也就是邮件的本地名,我们可以通过字符串切割的方式来进行处理即可,每一种语言都会有字符串的公共库,除非用 C 语言自己一个字符一个字符的去偏移 - 处理
.
,处理本地名的时候,同样也是通过字符串的库找到.
的位置,然后将其替换成空白,相当于去掉这个字符串 - 处理
+
,同理,在本地名中找到+
的位置,将其位置到本地名的结束位置涉及的字符串包含+
,全部干掉即可 - 最后将处理后的本地名,与原字符串中
@
后面的字符串拼接起来,就可以找到实际的字符串了
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
上面描述的处理逻辑已经很清楚了,我们重点要注意本地名的 .
和的情况, 和 +
的情况进行分类处理即可,关于计算不同邮件域名的个数,我们可以使用 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) }
四、总结:
可以看出我们这种简单实现的方式,时间复杂度与题目给出的 emails 的元素长度有关系,则时间复杂度实际上是 O(N) ,这个 N 指的就是 email 的长度
那么空间复杂度也是 O(N) ,因为咱们开辟了一个 哈希表,占用的空间最大的情况就是哈希表的长度等于 emails 的长度
原题地址:929. 独特的电子邮件地址
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~