专栏首页Michael阿明学习之路LeetCode 831. 隐藏个人信息

LeetCode 831. 隐藏个人信息

1. 题目

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

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

  1. 电子邮箱

定义名称 name 是长度大于等于 2 (length ≥ 2),并且只包含小写字母 a-z 和大写字母 A-Z 的字符串。

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

电子邮箱地址确定为有效的,并且格式是 “name1@name2.name3”。

为了隐藏电子邮箱,所有的名称 name 必须被转换成小写的,并且第一个名称 name 的第一个字母和最后一个字母的中间的所有字母由 5 个 ‘*’ 代替。

  1. 电话号码

电话号码是一串包括数字 0-9,以及 {'+', '-', '(', ')', ' '} 这几个字符的字符串。你可以假设电话号码包含 10 到 13 个数字。

电话号码的最后 10 个数字组成本地号码,在这之前的数字组成国际号码。注意,国际号码是可选的。我们只暴露最后 4 个数字并隐藏所有其他数字。

本地号码是有格式的,并且如 "***-***-1111" 这样显示,这里的 1 表示暴露的数字。

为了隐藏有国际号码的电话号码,像 "+111 111 111 1111",我们以 "+***-***-***-1111" 的格式来显示。在本地号码前面的 '+' 号和第一个 '-' 号仅当电话号码中包含国际号码时存在。例如,一个 12 位的电话号码应当以 "+**-" 开头进行显示。

注意:像 "(",")"," " 这样的不相干的字符以及不符合上述格式的额外的减号或者加号都应当被删除。

最后,将提供的信息正确隐藏后返回。

示例 1:
输入: "LeetCode@LeetCode.com"
输出: "l*****e@leetcode.com"
解释: 
所有的名称转换成小写, 第一个名称的第一个字符和最后一个字符中间由 5 个星号代替。
因此,"leetcode" -> "l*****e"。

示例 2:
输入: "AB@qq.com"
输出: "a*****b@qq.com"
解释: 
第一个名称"ab"的第一个字符和最后一个字符的中间必须有 5 个星号
因此,"ab" -> "a*****b"。

示例 3:
输入: "1(234)567-890"
输出: "***-***-7890"
解释: 
10 个数字的电话号码,那意味着所有的数字都是本地号码。

示例 4:
输入: "86-(10)12345678"
输出: "+**-***-***-5678"
解释: 
12 位数字,2 个数字是国际号码另外 10 个数字是本地号码 。
 
注意:
S.length <= 40。
邮箱的长度至少是 8。
电话号码的长度至少是 10。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/masking-personal-information 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 通过@判断是邮箱还是电话
  • 电话的话对数字个数计数
class Solution {	//C++
public:
    string maskPII(string S) {
    	int at = S.find("@");
    	string ans;
    	if(at != string::npos)
    	{
    		if(isupper(S[0]))
    			ans = string(1,S[0]+32)+"*****";
    		else
    			ans = string(1,S[0])+"*****";
    		for(int i = at-1; i < S.size(); ++i)
    		{
    			if(isupper(S[i]))
    				S[i] += 32;
    			ans += S[i];
    		}
    	}
        else
        {
            int count = 0;
            string last4;
            for(int i = S.size()-1; i >= 0; --i)
            {
                if(isdigit(S[i]))
                {
                    count++;
                    if(last4.size()<4)
                        last4 = S[i]+last4;
                }
            }
            if(count<=10)
                ans = "***-***-"+last4;
            else
                ans = "+"+string(count-10,'*')+"-***-***-"+last4;
        }
    	return ans;
    }
};

0 ms 6.1 MB

class Solution:# py3
    def maskPII(self, S: str) -> str:
        at = '@' in S
        ans = ""
        if at:
            if S[0].isupper():
                ans = S[0].lower()+"*****"
            else:
                ans = S[0]+"*****"
            idx = S.index('@')
            for i in range(idx-1, len(S)):
                if S[i].isupper():
                    ans += S[i].lower()
                else:
                    ans += S[i]
        else:
            count = 0
            last4 = ""
            for i in range(len(S)-1,-1,-1):
                if S[i].isdigit():
                    count += 1
                    if len(last4)<4:
                        last4 = S[i]+last4
            if count==10:
                ans = "***-***-"+last4
            else:
                ans = "+"+'*'*(count-10)+"-***-***-"+last4
        return ans

52 ms 13.6 MB

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 482. 密钥格式化

    给定一个密钥字符串S,只包含字母,数字以及 ‘-’(破折号)。N 个 ‘-’ 将字符串分成了 N+1 组。给定一个数字 K,重新格式化字符串,除了第一个分组以外...

    Michael阿明
  • LeetCode 67. 二进制求和

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-binary 著作权归领扣网络所有。商业转载...

    Michael阿明
  • LeetCode 524. 通过删除字母匹配到字典里最长单词(双指针)

    给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。 如果答案不止一个,返回长度最长且字典顺序最小的字符...

    Michael阿明
  • python对列表中的字典按[key]时间排序

    在翻看之前的一些面试题,发现其中有一个问题就是对列表中的字典按照某个key进行排序,题目是这样的:

    the5fire
  • 菜鸟如何使用Hanlp

    boss给了个做分词的任务,最开始想用的是结巴分词and正则表达式。后来发现结果并不好,需要一遍一遍筛选【第一个标准筛选出80%的数据,然后制定第二个标准,继续...

    用户3492023
  • Vijos P1784 数字统计【模拟】

    数字统计 背景 来自 NOIP2010 普及组 第一题 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如在给定范围[2, 22],数...

    Angel_Kitty
  • 剑指Offer 23-44题(Python版)

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

    小一
  • RTSP协议视频智能分析/智能识别服务平台EasyNVR新增自定义登录失败锁定用户功能

    对于流媒体服务器来说,登录鉴权的存在能够给与用户一定的安全保护,TSINGSEE青犀视频云边端架构视频平台提供简单的登录鉴权,并且在EasyNVR视频平台内新增...

    EasyNVR
  • Spark UDF加载外部资源

    由于Spark UDF的输入参数必须是数据列column,在UDF中进行如Redis查询、白/黑名单过滤前,需要加载外部资源(如配置参数、白名单)初始化它们的实...

    mikeLiu
  • JavaSwing-ItemListener接口

    用于接收项目事件的监听器界面。 对处理项目事件感兴趣的类将实现此接口。 然后使用该类创建的对象使用组件的addItemListener方法向该组件注册。 发生项...

    JavaEdge

扫码关注云+社区

领取腾讯云代金券