问题描述:
We are given a personal information string S
, which may represent either an email address or a phone number.
We would like to mask this personal information according to the following rules:
1. Email address:
We define a name to be a string of length ≥ 2
consisting of only lowercase letters a-z
or uppercase letters A-Z
.
An email address starts with a name, followed by the symbol '@'
, followed by a name, followed by the dot '.'
and followed by a name.
All email addresses are guaranteed to be valid and in the format of "[email protected]".
To mask an email, all names must be converted to lowercase and all letters between the first and last letter of the first namemust be replaced by 5 asterisks '*'
.
2. Phone number:
A phone number is a string consisting of only the digits 0-9
or the characters from the set {'+', '-', '(', ')', ' '}.
You may assume a phone number contains 10 to 13 digits.
The last 10 digits make up the local number, while the digits before those make up the country code. Note that the country code is optional. We want to expose only the last 4 digits and mask all other digits.
The local number should be formatted and masked as "***-***-1111",
where 1
represents the exposed digits.
To mask a phone number with country code like "+111 111 111 1111"
, we write it in the form "+***-***-***-1111".
The '+'
sign and the first '-'
sign before the local number should only exist if there is a country code. For example, a 12 digit phone number mask should start with "+**-"
.
Note that extraneous characters like "(", ")", " "
, as well as extra dashes or plus signs not part of the above formatting scheme should be removed.
Return the correct "mask" of the information provided.
Example 1:
Input: "[email protected]" Output: "l*****[email protected]" Explanation: All names are converted to lowercase, and the letters between the first and last letter of the first name is replaced by 5 asterisks. Therefore, "leetcode" -> "l*****e".
Example 2:
Input: "[email protected]" Output: "a*****[email protected]" Explanation: There must be 5 asterisks between the first and last letter of the first name "ab". Therefore, "ab" -> "a*****b".
Example 3:
Input: "1(234)567-890" Output: "***-***-7890" Explanation: 10 digits in the phone number, which means all digits make up the local number.
Example 4:
Input: "86-(10)12345678" Output: "+**-***-***-5678" Explanation: 12 digits, 2 digits for country code and 10 digits for local number.
Notes:
S.length <= 40
.- Emails have length at least 8.
- Phone numbers have length at least 10.
解题思路:
因为输入和输出只有两种可能:邮箱和电话。
而邮箱中含有特殊字符‘@’ , 我们可以以此作为区分来分辨邮箱和电话。
分别写两个方法来隐蔽邮箱和电话。
1. 邮箱: 我们可以根据邮箱的格式来找到name1,name2,name3并按要求处理
2.电话:需要注意的是,最后的结果为统一格式!
从后向前扫描,前四个数字不遮蔽,后面的数字要遮蔽。
在扫完前四个后加入分隔符‘-’。并使用其他计数器来计数。每到3的倍数加入分隔符。
最后结果需要检查最后一个字符是否为分隔符‘-’,若是则需要弹出。
最后需要检查数字长度,当数字计数器>6即电话号码长度大于10时,则需要加入‘+’
代码:
class Solution { public: string maskPII(string S) { if(S.empty()) return S; if(S.find("@") != string::npos) return maskEmail(S); return maskPhone(S); } private: string toLower(string s){ for(int i = 0; i < s.size(); i++){ if(isupper(s[i])) s[i] = tolower(s[i]); } return s; } string maskEmail(string s){ int spr1 = s.find("@"); string mask1; mask1.push_back(tolower(s[0])); mask1 += "*****"; mask1.push_back(tolower(s[spr1-1])); int spr2 = s.find("."); string mask2 = s.substr(spr1+1, (spr2-spr1-1)); mask2 = toLower(mask2); string mask3 = s.substr(spr2+1); mask3 = toLower(mask3); return mask1 + "@" + mask2 + "." + mask3; } string maskPhone(string s){ int n = s.size()-1; int cnt = 4, digitCnt = 0; string ret; while(n > -1){ if(isdigit(s[n])){ if(cnt == 0){ ret.push_back('*'); digitCnt++; if(digitCnt % 3 == 0) ret.push_back('-'); }else{ cnt--; ret.push_back(s[n]); if(cnt == 0) ret.push_back('-'); } } n--; } if(ret.back() == '-') ret.pop_back(); if(digitCnt > 6) ret.push_back('+'); reverse(ret.begin(), ret.end()); return ret; } };