這是悅樂書的第356次更新,第383篇原創
01看題和準備
今天介紹的是LeetCode
算法題中Easy
級別的第218
題(順位題號是927
)。每封電子郵件都包含本地名稱和域名,以@
符號分隔。
例如,在[email protected]
中,alice
是本地名稱,leetcode.com
是域名。
除了小寫字母,這些電子郵件可能包含'.'
或'+'
。
如果在電子郵件地址的本地名稱部分中的某些字符之間添加句點('.'
),則在那裏發送的郵件將轉發到本地名稱中沒有點的同一地址。例如,“[email protected]”
和“[email protected]”
轉發到同一個電子郵件地址。(請注意,此規則不適用於域名。)
如果在本地名稱中添加加號('+'
),則會忽略第一個加號後面的所有內容。這允許過濾某些電子郵件,例如[email protected]
將轉發到[email protected]
。(同樣,此規則不適用於域名。)
可以同時使用這兩個規則。
給定電子郵件列表,我們會向列表中的每個地址發送一封電子郵件。有多少不同的地址實際接收郵件?例如:
輸入:[“[email protected]”,“[email protected]”,
“[email protected]”]
輸出:2
說明:“[email protected]”和“[email protected]”實際收到郵件
注意:
1 <= emails[i].length <= 100
1 <= emails.length <= 100
每封
emails[i]
都包含一個'@'
字符。所有本地名稱和域名都是非空的。
本地名稱不以
“+”
字符開頭。
02 第一種解法
根據題目給的規則,對字符串分兩段處理,在本地名稱中,如果存在+
號,就截取+
號前的字符串,變成新的本地名稱,如果遇到點號,就將點號全部替換,得到新的本地名稱,再和域名部分拼接在一起,存入HashSet
中,返回HashSet
的size
即可。
public int numUniqueEmails(String[] emails) {
Set<String> set = new HashSet<String>();
for (String email : emails) {
String tem = email;
int index = tem.indexOf('@');
// 截取@之前的字符串
tem = tem.substring(0, index);
// 有'+',就再截取'+'號之前的字符串
if (tem.indexOf('+') > 0) {
tem = tem.substring(0, tem.indexOf('+'));
}
// 將所有點號替換
tem = tem.replace(".", "");
// 將@符號前的新字符串和原字符串@符號後的域名拼接
// 存入HashSet
set.add(tem+email.substring(index));
}
return set.size();
}
03 第二種解法
我們也可以不使用字符串截取、替換等方法,直接對字符進行判斷,然後拼接成新的email
地址,最後存入HashSet
中,返回HashSet
的size
即可。
public int numUniqueEmails2(String[] emails) {
Set<String> set = new HashSet<String>();
for (String email : emails) {
set.add(handleEmail(email));
}
return set.size();
}
public String handleEmail(String email) {
StringBuilder sb = new StringBuilder();
int n = email.length();
// 是否遇到@符號
boolean flag = false;
for (int i=0; i<n; i++) {
char c = email.charAt(i);
if (!flag) {
//沒遇到@符號前,遇到.號一律 跳過
if (c == '.') {
continue;
}
//遇到+號,往後跳一位,開始尋找@符號
if (c == '+') {
i++;
while (i < n && email.charAt(i) != '@') {
i++;
}
c = email.charAt(i);
// 已經遇到@符號
flag = true;
} else if(c == '@'){
// 沒遇到+號,卻遇到@符號了
flag = true;
}
}
sb.append(c);
}
return sb.toString();
}
04 小結
算法專題目前已連續日更超過六個月,算法題文章224+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!