leetcode 831題解【C++/Java/Python】

weixin_34249678發表於2018-08-09

831. 隱藏個人資訊

831. Masking Personal Information

題目:

給你一條個人資訊 string S,它可能是一個郵箱地址,也可能是一個電話號碼。

我們將隱藏它的隱私資訊,通過如下規則:

  1. 電子郵箱

定義名稱name的長度大於2,並且只包含小寫字母 a-z 和大寫字母 A-Z

電子郵箱地址由名稱 name開頭,緊接著是符號'@',後面接著一個名稱 name,再接著一個點號 '.',然後是一個名稱name

電子郵箱地址確定為有效的,並且格式是"name1@name2.name3"

為了隱藏電子郵箱,所有的名稱 name必須被轉換成小寫的,並且第一個名稱 name 的第一個字母和最後一個字母的中間的所有字母由 5'*' 代替。

  1. 電話號碼

電話號碼是一串包括陣列 0-9,以及 {'+', '-', '(', ')', ' '}這幾個字元的字串。你可以假設電話號碼包含 1013 個數字。

電話號碼的最後 10 個數字組成本地號碼,在這之前的數字組成國際號碼。注意,國際號碼是可選的。我們只暴露最後4個數字並隱藏所有其他數字。

本地號碼是有格式的,並且如 "***-***-1111" 這樣顯示,這裡的 1 表示暴露的數字。

為了隱藏有國際號碼的電話號碼,像 "+111 111 111 1111",我們以 "+***-***-***-1111" 的格式來顯示。在本地號碼前面的 '+' 號和第一個 '-'號僅當電話號碼中包含國際號碼時存在。例如,一個 12 位的電話號碼應當以 "+**-" 開頭進行顯示。

注意:像 "("")"" " 這樣的不相干的字元以及不符合上述格式的額外的減號或者加號都應當被刪除。

最後,將提供的資訊正確隱藏後返回。

題解:

'@'符號來區分是郵箱還是電話。如果是郵箱,先將整個字串按照題目要求轉為小寫,然後將郵箱的name1修改為形如"l*****e"的格式,即將第2位到倒數第2位轉為掩碼錶示"*****"表示。

電話號碼,先過濾掉非數字字元。電話號碼的長度在10-13之間。依據長度,分別取字首{"", "+*-", "+**-", "+***-"},然後追加"***-***-",最後加上電話號碼的末尾4個數字。

C++
#include <regex> // regex_replace
#include <algorithm> // transform

class Solution {
private:
    string prefix[4] = {"", "+*-", "+**-", "+***-"};
public: 
    string maskPII(string S) {
        int at = S.find('@'); // 用來判斷是不是郵箱
        if(at != string::npos) {
            transform(S.begin(), S.end(), S.begin(), ::tolower);
            S.replace(1, at-2, "*****"); 
        }
        else {
            S = regex_replace(S, regex("[^0-9]"), "");//  過濾非數字
            int n = S.length();
            S = prefix[n-10] + "***-***-" + S.substr(n-4);
        }
        return S;
    }
};
複製程式碼
Java
class Solution {
    private String prefix[] = {"", "+*-", "+**-", "+***-"}; // 電話的字首
    public String maskPII(String S) {
        int at = S.indexOf('@');
        if(at != -1) {
            S = S.toLowerCase();
            S = S.substring(0, 1) + "*****" + S.substring(at-1);
        }
        else {
            S = S.replaceAll("[^0-9]", "");//去掉非數字字元
            int n = S.length();
            S = prefix[n-10] + "***-***-" + S.substring(n-4);
        }
        return S;
    }
}
複製程式碼
Python
import re
class Solution(object):
    prefix = ["", "+*-", "+**-", "+***-"]
    def maskPII(self, S):
        """
        :type S: str
        :rtype: str
        """
        at = S.find('@') # 用以判斷是否是郵箱
        if at != -1:
            S = S.lower()
            S = S[0] + "*****" + S[at-1:] 
        else:
            S = re.sub("[^0-9]", "", S) # 過濾非數字字元
            n = len(S)
            S = self.prefix[n-10] + "***-***-" + S[n-4:]
        return S
複製程式碼

相關文章