1. 程式人生 > >leetcode 929獨特的電子郵件地址

leetcode 929獨特的電子郵件地址

929.獨特的電子郵件地址

每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。

例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。

除了小寫字母,這些電子郵件還可能包含 ‘,’ 或 ‘+’。

如果在電子郵件地址的本地名稱部分中的某些字元之間新增句點(’.’),則發往那裡的郵件將會轉發到本地名稱中沒有點的同一地址。例如,"[email protected]” 和 “[email protected]” 會轉發到同一電子郵件地址。 (請注意,此規則不適用於域名。)

如果在本地名稱中新增加號(’+’),則會忽略第一個加號後面的所有內容。這允許過濾某些電子郵件,例如

[email protected] 將轉發到 [email protected]。 (同樣,此規則不適用於域名。)

可以同時使用這兩個規則。

給定電子郵件列表 emails,我們會向列表中的每個地址傳送一封電子郵件。實際收到郵件的不同地址有多少?

示例:

輸入:[“[email protected]”,“[email protected]”,“[email protected]”]
輸出:2
解釋:實際收到郵件的是 "[email protected]" 和 "[email protected].tcode.com"。

提示:

1 <= emails[i].length <= 100
1 <= emails.length <= 100
每封 emails[i] 都包含有且僅有一個 ‘@’ 字元。


思路

簡單題,設定一個集合set(特點是元素不重複),迴圈遍歷emails所有元素,進行處理:對於本地名稱,去掉所有的’ . ‘,去掉第一個’+'之後的所有內容;域名不做處理,然後,加入集合,最後返回集合的大小即可。

/**
 * @param {string[]} emails
 * @return {number}
 */
var numUniqueEmails = function(emails) {
  let differentEmails = new Set();
  for (let email of emails) {
    let [local, net] = email.split('@');  // 本地和域名
    while (local.includes('.')) {
      local = local.replace('.', '');       // 消滅'.',每次只能替換一個  
    }
    local = local.split('+')[0];          // 取一個加號前面的部分
    differentEmails.add(`${local}@${net}`)
  }
  return differentEmails.size;
};