问题:
英文:
Every email consists of a local name and a domain name, separated by the @ sign.
For example, in [email protected]
, alice
is the local name, and leetcode.com
is the domain name.
Besides lowercase letters, these emails may contain '.'
s or '+'
s.
If you add periods ('.'
) between some characters in the local name part of an email address, mail sent there will be forwarded to the same address without dots in the local name. For example, "[email protected]"
and "[email protected]"
forward to the same email address. (Note that this rule does not apply for domain names.)
If you add a plus ('+'
) in the local name, everything after the first plus sign will be ignored. This allows certain emails to be filtered, for example [email protected]
will be forwarded to [email protected]
. (Again, this rule does not apply for domain names.)
It is possible to use both of these rules at the same time.
Given a list of emails
, we send one email to each address in the list. How many different addresses actually receive mails?
中文:
每封电子邮件都包含本地名称和域名,以@符号分隔。
例如,在[email protected]中,alice是本地名称,leetcode.com是域名。
除了小写字母,这些电子邮件可能包含'.'或'+'。
如果在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'),则将发送的邮件将转发到本地名称中没有('.')的同一地址。例如,“[email protected]”和“[email protected]”转发到同一电子邮件地址。 (请注意,此规则不适用于域名。)
如果在本地名称中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如[email protected]将转发到[email protected]。 (同样,此规则不适用于域名。)
可以同时使用这两个规则。
给定电子邮件列表,我们会向列表中的每个地址发送一封电子邮件。有多少不同的地址实际接收邮件?
Example 1:
Input: ["[email protected]","[email protected]","[email protected]"] Output: 2 Explanation: "[email protected]" and "[email protected]" actually receive mails
Note:
1 <= emails[i].length <= 100
1 <= emails.length <= 100
- Each
emails[i]
contains exactly one'@'
character.
解决方法:
创建一个Set,因为Set中的元素不重复。
分别按规则处理本地名称和域名,再拼接,并放入Set中。
最后Set中元素的个数就为可能发送的地址个数。
package cn.leetcode.easy;
import java.util.HashSet;
import java.util.Set;
/**
* Every email consists of a local name and a domain name, separated by the @ sign.
*
* For example, in [email protected], alice is the local name, and leetcode.com is the domain name.
*
* Besides lowercase letters, these emails may contain '.'s or '+'s.
*
* If you add periods ('.') between some characters in the local name part of an email address,
* mail sent there will be forwarded to the same address without dots in the local name.
* For example, "[email protected]" and "[email protected]" forward to the same email address.
* (Note that this rule does not apply for domain names.)
*
* If you add a plus ('+') in the local name, everything after the first plus sign will be ignored.
* This allows certain emails to be filtered,
* for example [email protected] will be forwarded to [email protected].
* (Again, this rule does not apply for domain names.)
*
* It is possible to use both of these rules at the same time.
*
* Given a list of emails, we send one email to each address in the list.
* How many different addresses actually receive mails?
*
* @author kimtian
*/
public class UniqueEmailAddresses {
/**
* 邮件地址个数计算
*
* @param emails 输入的邮件地址
* @return 可能发送到的邮件地址个数
*/
public static int numUniqueEmails(String[] emails) {
//创建一个set存放处理后的邮件地址,因为set中不会有重复的元素
Set<String> emailSet = new HashSet<>();
// 题干备注emails数组的长度为>=100且<=1
if (emails.length >= 1 && emails.length <= 100) {
//循环emails数组,拿到每一个email地址
for (String string : emails) {
//本地名称为邮件地址@前的部分
String localName = string.substring(0, string.indexOf("@"));
//如果有(+)则只取(+)前的邮箱地址
if (localName.contains("+")) {
localName = localName.substring(0, localName.indexOf("+"));
}
//如果有(.)则将其去除
localName = localName.replace(".", "");
//域名
String domainName = string.substring(string.indexOf("@"));
//将本地名称和域名再次拼接
string = localName + domainName;
//存放在set中,set会帮忙直接过滤掉重复地址
emailSet.add(string);
}
}
return emailSet.size();
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
String[] aa = {"[email protected]", "[email protected]", "[email protected]"};
System.out.println(numUniqueEmails(aa));
}
}