LeetCode.927-獨特郵箱地址(Unique Email Addresses)

這是悅樂書的第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中,返回HashSetsize即可。

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中,返回HashSetsize即可。

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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章