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, andleetcode.com
is the domain name.
Besides lowercase letters, these emails may contain'.'
s or'+'
s.
If you add periods ('.'
) between some characters in thelocal namepart 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 thelocal 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 ofemails
, we send one email to each address in the list. How many different addresses actually receive mails?
Example 1:
Input: ["[email protected]","[email protected]","[email protected]"]
Output: 2
Explanation: "[email protected]" and "[email protected]" actually receive mails
这题也比较直接,目测面试不会出,处理一下local name,然后统计不同email address个数
class Solution {
public int numUniqueEmails(String[] emails) {
if(emails == null || emails.length == 0)
return 0;
HashSet<String> set = new HashSet<String>();
for(String email: emails) {
String processed = process(email);
if(processed.length() != 0)
set.add(processed);
}
return set.size();
}
public String process(String email) {
if(email == null || email.length() <= 1)
return "";
int delimiterIndex = 0;
while(delimiterIndex != email.length() && email.charAt(delimiterIndex) != '@')
delimiterIndex++;
StringBuilder localName = new StringBuilder();
for(int i = 0; i < delimiterIndex; i++) {
char c = email.charAt(i);
if(c == '.') {
continue;
} else if(c == '+') {
break;
} else {
localName.append(c);
}
}
return localName.append(email.substring(delimiterIndex)).toString();
}
}