前言
Weekly Contest 108的第一题 独特的电子邮件地址:
每封电子邮件都由一个本地名称和一个域名组成,以
@
符号分隔。例如,在
alice@leetcode.com
中,alice
是本地名称,而leetcode.com
是域名。除了小写字母,这些电子邮件还可能包含
','
或'+'
。如果在电子邮件地址的本地名称部分中的某些字符之间添加句点(
'.'
),则发往那里的邮件将会转发到本地名称中没有点的同一地址。例如,"alice.z@leetcode.com”
和“alicez@leetcode.com”
会转发到同一电子邮件地址。 (请注意,此规则不适用于域名。)如果在本地名称中添加加号(
'+'
),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如m.y+name@email.com
将转发到my@email.com
。 (同样,此规则不适用于域名。)可以同时使用这两个规则。
给定电子邮件列表 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"。
提示
1 <= emails[i].length <= 100
1 <= emails.length <= 100
- 每封
emails[i]
都包含有且仅有一个'@'
字符。
解题思路
本题其实十分简单,首先要先理解清楚两条规则的含义:
-
本地名称含有句点(
'.'
),则忽略这个句号 -
本地名称含有加号(
'+'
),则忽略这个加号后面的内容
所以只要先把email
地址以@
为分隔符分割成2部分,分别为本地名称和域名,然后按照前面的分析来处理本地名称即可。
实现代码
/**
* 929. 独特的电子邮件地址
* @param emails
* @return
*/
public int numUniqueEmails(String[] emails) {
Set<String> set=new HashSet<>();
for(String email:emails){
//本地名称
String name=email.substring(0,email.indexOf("@"));
//域名
String domain=email.substring(email.indexOf("@"));
//根据指定规则解析后的本地名称,先按加号切割字符串,然后替换'.'
String newName=name.substring(0,name.indexOf("+")).replaceAll(".","");
//使用HashSet去重
set.add(newName+domain);
}
return set.size();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。