leetcode 831. Masking Personal Information 题解【C++/Java/Python】

831. 隐藏个人信息
831. Masking Personal Information

题目:

给你一条个人信息 string S,它可能是一个邮箱地址,也可能是一个电话号码。

我们将隐藏它的隐私信息,通过如下规则:

  1. 电子邮箱

定义名称name的长度大于2,并且只包含小写字母 a-z 和大写字母 A-Z

电子邮箱地址由名称 name开头,紧接着是符号'@',后面接着一个名称 name,再接着一个点号 ‘.',然后是一个名称name

电子邮箱地址确定为有效的,并且格式是"[email protected]"

为了隐藏电子邮箱,所有的名称 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
点赞