Welcome to Subscribe On Youtube
831. Masking Personal Information
Description
You are given a personal information string s
, representing either an email address or a phone number. Return the masked personal information using the below rules.
Email address:
An email address is:
- A name consisting of uppercase and lowercase English letters, followed by
- The
'@'
symbol, followed by - The domain consisting of uppercase and lowercase English letters with a dot
'.'
somewhere in the middle (not the first or last character).
To mask an email:
- The uppercase letters in the name and domain must be converted to lowercase letters.
- The middle letters of the name (i.e., all but the first and last letters) must be replaced by 5 asterisks
"*****"
.
Phone number:
A phone number is formatted as follows:
- The phone number contains 10-13 digits.
- The last 10 digits make up the local number.
- The remaining 0-3 digits, in the beginning, make up the country code.
- Separation characters from the set
{'+', '-', '(', ')', ' '}
separate the above digits in some way.
To mask a phone number:
- Remove all separation characters.
- The masked phone number should have the form:
"***-***-XXXX"
if the country code has 0 digits."+*-***-***-XXXX"
if the country code has 1 digit."+**-***-***-XXXX"
if the country code has 2 digits."+***-***-***-XXXX"
if the country code has 3 digits.
"XXXX"
is the last 4 digits of the local number.
Example 1:
Input: s = "LeetCode@LeetCode.com" Output: "l*****e@leetcode.com" Explanation: s is an email address. The name and domain are converted to lowercase, and the middle of the name is replaced by 5 asterisks.
Example 2:
Input: s = "AB@qq.com" Output: "a*****b@qq.com" Explanation: s is an email address. The name and domain are converted to lowercase, and the middle of the name is replaced by 5 asterisks. Note that even though "ab" is 2 characters, it still must have 5 asterisks in the middle.
Example 3:
Input: s = "1(234)567-890" Output: "***-***-7890" Explanation: s is a phone number. There are 10 digits, so the local number is 10 digits and the country code is 0 digits. Thus, the resulting masked number is "***-***-7890".
Constraints:
s
is either a valid email or a phone number.- If
s
is an email:8 <= s.length <= 40
s
consists of uppercase and lowercase English letters and exactly one'@'
symbol and'.'
symbol.
- If
s
is a phone number:10 <= s.length <= 20
s
consists of digits, spaces, and the symbols'('
,')'
,'-'
, and'+'
.
Solutions
-
class Solution { public String maskPII(String s) { if (Character.isLetter(s.charAt(0))) { s = s.toLowerCase(); int i = s.indexOf('@'); return s.substring(0, 1) + "*****" + s.substring(i - 1); } StringBuilder sb = new StringBuilder(); for (char c : s.toCharArray()) { if (Character.isDigit(c)) { sb.append(c); } } s = sb.toString(); int cnt = s.length() - 10; String suf = "***-***-" + s.substring(s.length() - 4); return cnt == 0 ? suf : "+" + "*".repeat(cnt) + "-" + suf; } }
-
class Solution { public: string maskPII(string s) { int i = s.find('@'); if (i != -1) { string ans; ans += tolower(s[0]); ans += "*****"; for (int j = i - 1; j < s.size(); ++j) { ans += tolower(s[j]); } return ans; } string t; for (char c : s) { if (isdigit(c)) { t += c; } } int cnt = t.size() - 10; string suf = "***-***-" + t.substr(t.size() - 4); return cnt == 0 ? suf : "+" + string(cnt, '*') + "-" + suf; } };
-
class Solution: def maskPII(self, s: str) -> str: if s[0].isalpha(): s = s.lower() return s[0] + '*****' + s[s.find('@') - 1 :] s = ''.join(c for c in s if c.isdigit()) cnt = len(s) - 10 suf = '***-***-' + s[-4:] return suf if cnt == 0 else f'+{"*" * cnt}-{suf}'
-
func maskPII(s string) string { i := strings.Index(s, "@") if i != -1 { s = strings.ToLower(s) return s[0:1] + "*****" + s[i-1:] } t := []rune{} for _, c := range s { if c >= '0' && c <= '9' { t = append(t, c) } } s = string(t) cnt := len(s) - 10 suf := "***-***-" + s[len(s)-4:] if cnt == 0 { return suf } return "+" + strings.Repeat("*", cnt) + "-" + suf }
-
function maskPII(s: string): string { const i = s.indexOf('@'); if (i !== -1) { let ans = s[0].toLowerCase() + '*****'; for (let j = i - 1; j < s.length; ++j) { ans += s.charAt(j).toLowerCase(); } return ans; } let t = ''; for (const c of s) { if (/\d/.test(c)) { t += c; } } const cnt = t.length - 10; const suf = `***-***-${t.substring(t.length - 4)}`; return cnt === 0 ? suf : `+${'*'.repeat(cnt)}-${suf}`; }