天天看點

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

中,傳回

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

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