Leetcode 831.隐藏个人信息

本文最后更新于:2024年6月7日 中午

题意描述

题目:隐藏个人信息

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

电子邮件地址:

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

一个 名字 ,由大小写英文字母组成,后面跟着
一个 ‘@’ 字符,后面跟着
一个 域名 ,由大小写英文字母和一个位于中间的 ‘.’ 字符组成。‘.’ 不会是域名的第一个或者最后一个字符。
要想隐藏电子邮件地址中的个人信息:

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

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

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

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

解题思路

按题意模拟即可,分开两种情况讨论

先查找是否有@

有则是邮箱 没有是电话

你能否写一个不用正则表达式下的代码?

时间复杂度:O(n)

空间复杂度:O(n)

示例代码

Python3

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
27
28
29
30
31
class Solution:

def phone(self,s,i):
y = "" if i == 0 else "+" + "*" * i +"-"
ans = 0
for j in range(0,len(s)-i - 4):
if ans == 3:
ans = 0
y+="-"
y+="*"
ans+=1
return y+"-" + s[-4:]

def cha(self,s):
return True if "@" in s else False

def maskPII(self, s: str) -> str:
a = self.cha(s)
y = ""
if a==True:
i = s.split("@")
i[0] = i[0].lower()
y+= i[0][0]+"*****"+i[0][-1] + "@" + i[1].lower()
return y
else:
for i in range(0,len(s)):
if s[i] in ["+","-","(",")"," "] : continue
else: y+=s[i]
n = len(y)
return self.phone(y,n-10)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class Solution {
public:

string phone(string s, int i ){
string y = "";
if(i != 0){ y+= '+';}
for(int j = 0; j < i; j++){
y+='*';
}


if(i != 0){ y+= '-';}

int ans = 0;
for(int j = 0; j < s.size() - i - 3; j++){
if(ans == 3){
y+='-';
ans = 0;
}else{
y+='*';
ans++;
}
}
y+='-';
for(int j = s.size()-4; j < s.size(); j++){
y+=s[j];
}
return y;
}

string mail(string s){
bool a = false;
string y = "";
y+=tolower(s[0]);
y+="*****";
for(int i = 0; i < s.size(); i++){
if(s[i]=='@'){
a = true;
y+=tolower(s[i-1]);
}

if(a== true){
y+=tolower(s[i]);
}
}
return y;
}

bool cha(string s){
for(int i = 0; i < s.size(); i++){
if (s[i]=='@'){return true;}
}
return false;
}

string maskPII(string s) {
bool a = cha(s);
if(a==true){
return mail(s);
}else{
string x = "";
int n = 0;
for(int i = 0; i < s.size(); i++){
if(s[i]=='+'||s[i]=='-'||s[i]=='('||s[i]==')'||s[i]==' '){
continue;
}else{
x+=s[i];
n++;
}
}
return phone(x,n-10);
}
}
};

到此结束

w


Leetcode 831.隐藏个人信息
http://blog.bingyue.top/2023/04/01/leetcode831/
作者
bingyue
发布于
2023年4月1日
许可协议