0831-隐藏个人信息

Raphael Liu Lv10

给你一条个人信息字符串 s ,可能表示一个 邮箱地址 ,也可能表示一串 电话号码 。返回按如下规则 隐藏 个人信息后的结果:

电子邮件地址:

一个电子邮件地址由以下部分组成:

  • 一个 名字 ,由大小写英文字母组成,后面跟着
  • 一个 '@' 字符,后面跟着
  • 一个 域名 ,由大小写英文字母和一个位于中间的 '.' 字符组成。'.' 不会是域名的第一个或者最后一个字符。

要想隐藏电子邮件地址中的个人信息:

  • 名字域名 部分的大写英文字母应当转换成小写英文字母。
  • 名字 中间的字母(即,除第一个和最后一个字母外)必须用 5 个 "*****" 替换。

电话号码:

一个电话号码应当按下述格式组成:

  • 电话号码可以由 10-13 位数字组成
  • 后 10 位构成 本地号码
  • 前面剩下的 0-3 位,构成 国家代码
  • 利用 {'+', '-', '(', ')', ' '} 这些 分隔字符 按某种形式对上述数字进行分隔

要想隐藏电话号码中的个人信息:

  • 移除所有 分隔字符
  • 隐藏个人信息后的电话号码应该遵从这种格式:
    • "***-***-XXXX" 如果国家代码为 0 位数字
    • "+*-***-***-XXXX" 如果国家代码为 1 位数字
    • "+**-***-***-XXXX" 如果国家代码为 2 位数字
    • "+***-***-***-XXXX" 如果国家代码为 3 位数字
  • "XXXX" 是最后 4 位 本地号码

示例 1:

**输入:** s = "LeetCode@LeetCode.com"
**输出:** "l*****e@leetcode.com"
**解释:** s 是一个电子邮件地址。
名字和域名都转换为小写,名字的中间用 5 个 * 替换。

示例 2:

**输入:** s = "AB@qq.com"
**输出:** "a*****b@qq.com"
**解释:** s 是一个电子邮件地址。
名字和域名都转换为小写,名字的中间用 5 个 * 替换。
注意,尽管 "ab" 只有两个字符,但中间仍然必须有 5 个 * 。

示例 3:

**输入:** s = "1(234)567-890"
**输出:** "***-***-7890"
**解释:** s 是一个电话号码。
共计 10 位数字,所以本地号码为 10 位数字,国家代码为 0 位数字。
因此,隐藏后的电话号码应该是 "***-***-7890" 。

提示:

  • s 是一个 有效 的电子邮件或者电话号码
  • 如果 s 是一个电子邮件:
    • 8 <= s.length <= 40
    • s 是由大小写英文字母,恰好一个 '@' 字符,以及 '.' 字符组成
  • 如果 s 是一个电话号码:
    • 10 <= s.length <= 20
    • s 是由数字、空格、字符 '('')''-''+' 组成

方法一:模拟

我们首先判断 s 是邮箱还是电话号码。显然,如果 s 中有字符 `@’,那么它是邮箱,否则它是电话号码。

如果 s 是邮箱,我们将 s 的 `@’ 之前的部分保留第一个和最后一个字符,中间用 ``*****” 代替,并将整个字符串转换为小写。

如果 s 是电话号码,我们只保留 s 中的所有数字。使用首先将最后 10 位本地号码变成 ``--XXXX” 的形式,再判断 s 中是否有额外的国际号码。如果有,则将国际号码之前添加 `+’ 号并加到本地号码的最前端。

  • 如果有 10 位数字,则加上前缀位空字符串。
  • 如果有 11 位数字,则加上前缀 ``+*-“。
  • 如果有 12 位数字,则不加上前缀 ``+**-“。
  • 如果有 13 位数字,则不加上前缀 ``+**”。
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
vector<string> country = {"", "+*-", "+**-", "+***-"};

string maskPII(string s) {
string res;
int at = s.find("@");
if (at != string::npos) {
transform(s.begin(), s.end(), s.begin(), ::tolower);
return s.substr(0, 1) + "*****" + s.substr(at - 1);
}
s = regex_replace(s, regex("[^0-9]"), "");
return country[s.size() - 10] + "***-***-" + s.substr(s.size() - 4);
}
};
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
String[] country = {"", "+*-", "+**-", "+***-"};

public String maskPII(String s) {
int at = s.indexOf("@");
if (at > 0) {
s = s.toLowerCase();
return (s.charAt(0) + "*****" + s.substring(at - 1)).toLowerCase();
}
s = s.replaceAll("[^0-9]", "");
return country[s.length() - 10] + "***-***-" + s.substring(s.length() - 4);
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Solution {
string[] country = {"", "+*-", "+**-", "+***-"};

public string MaskPII(string s) {
int at = s.IndexOf("@");
if (at > 0) {
s = s.ToLower();
return (s[0] + "*****" + s.Substring(at - 1)).ToLower();
}
StringBuilder sb = new StringBuilder();
foreach (char c in s) {
if (char.IsDigit(c)) {
sb.Append(c);
}
}
s = sb.ToString();
return country[s.Length - 10] + "***-***-" + s.Substring(s.Length - 4);
}
}
[sol1-Python3]
1
2
3
4
5
6
7
class Solution:
def maskPII(self, s: str) -> str:
at = s.find('@')
if at >= 0:
return (s[0] + "*" * 5 + s[at - 1:]).lower()
s = "".join(i for i in s if i.isdigit())
return ["", "+*-", "+**-", "+***-"][len(s) - 10] + "***-***-" + s[-4:]
[sol1-Go]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func maskPII(s string) string {
at := strings.Index(s, "@")
if at > 0 {
s = strings.ToLower(s)
return strings.ToLower(string(s[0])) + "*****" + s[at-1:]
}
var sb strings.Builder
for i := 0; i < len(s); i++ {
c := s[i]
if unicode.IsDigit(rune(c)) {
sb.WriteByte(c)
}
}
s = sb.String()
country := []string{"", "+*-", "+**-", "+***-"}
return country[len(s)-10] + "***-***-" + s[len(s)-4:]
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const country = ["", "+*-", "+**-", "+***-"];

var maskPII = function(s) {
const at = s.indexOf("@");
if (at > 0) {
s = s.toLowerCase();
return (s[0] + "*****" + s.substring(at - 1)).toLowerCase();
}
let sb = "";
for (let i = 0; i < s.length; i++) {
const c = s.charAt(i);
if ('0' <= c && c <= '9') {
sb += c;
}
}
s = sb.toString();
return country[s.length - 10] + "***-***-" + s.substring(s.length - 4);
};
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define MAX_STR_SIZE 16

const char* country[] = {"", "+*-", "+**-", "+***-"};

char * maskPII(char * s){
char *at = strchr(s, '@');
if (at != NULL) {
for (int i = 0; s[i] != '\0'; i++) {
s[i] = tolower(s[i]);
}
char *res = (char *)calloc(strlen(s) + 8, sizeof(char));
sprintf(res, "%c%s%s",s[0], "*****", at - 1);
return res;
}
char tmp[MAX_STR_SIZE];
int pos = 0;
for (int i = 0; s[i] != '\0'; i++) {
if (isdigit(s[i])) {
tmp[pos++] = s[i];
}
}
tmp[pos] = '\0';
char *res = (char *)calloc(20, sizeof(char));
sprintf(res, "%s%s%s", country[pos - 10], "***-***-", tmp + pos - 4);
return res;
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。
  • 空间复杂度:O(n),其中 n 是字符串的长度。
 Comments
On this page
0831-隐藏个人信息