題目
每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。
例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。
除了小寫字母,這些電子郵件還可能包含 ‘,’ 或 ‘+’。
如果在電子郵件地址的本地名稱部分中的某些字符之間添加句點(’.’),則發往那裏的郵件將會轉發到本地名稱中沒有點的同一地址。例如,"[email protected]” 和 “[email protected]” 會轉發到同一電子郵件地址。 (請注意,此規則不適用於域名。)
如果在本地名稱中添加加號(’+’),則會忽略第一個加號後面的所有內容。這允許過濾某些電子郵件,例如 [email protected] 將轉發到 [email protected]。 (同樣,此規則不適用於域名。)
可以同時使用這兩個規則。
給定電子郵件列表 emails,我們會向列表中的每個地址發送一封電子郵件。實際收到郵件的不同地址有多少?
思路
按照規則將郵件地址轉換爲正常地址,然後放入set集合 最後統計set的大小即爲電子郵件個數
代碼
import java.util.Set;
import java.util.HashSet;
/**
* 按照規則將郵件地址轉換爲正常地址,然後放入set集合 最後統計set的大小即爲電子郵件個數
*/
class Solution {
public int numUniqueEmails(String[] emails) {
//用於轉換後正常的電子郵件
Set<String> uniqueEmails = new HashSet<String>();
for(int j = 0 ; j < emails.length; ++j){
char[] emails2char = emails[j].toCharArray();
// @ 符號的位置
int posAt = Integer.MAX_VALUE;
// + 符合的位置
int posAdd = 0;
//用於存儲過程中轉換的正常的電子郵件
StringBuilder sb = new StringBuilder();
//得到 @ 的位置
for(int i = 0; i < emails[j].length(); ++ i){
if(emails2char[i] == '@'){
posAt = i;
}
}
//進行郵件地址轉換
for(int i = 0; i < emails[j].length(); ++i){
if(emails2char[i] == '.' && i < posAt){
continue;
}
if(emails2char[i] == '+'){
i = posAt;
continue;
}
sb.append(emails2char[i]);
}
uniqueEmails.add(sb.toString());
}
return uniqueEmails.size();
}
}