Leetcode 831. 隐藏个人信息 C++

Leetcode 831. 隐藏个人信息

题目

给你一条个人信息字符串 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。

题解

模拟
根据题目要求进行处理。详细过程见代码

代码

	bool isBig(char c){
        return c>='A' && c<='Z';
    }
    string maskEmail(string& S){		//隐藏邮箱的相关信息,只因此name1,同时大写转小写
        int i=1,j;
        if(isBig(S[0])) S[0] += 'a'-'A';		//第一个字母是大写,则转换成小写
        string ans;
        ans = S[0];		//只保留第一个字符
        ans += "*****";
        while(S[i+1]!='@'){		//找到分隔符,从而找到name2的起点
            i++;
        }    
        if(isBig(S[i])) S[i] += 'a'-'A';
        while(i<S.length()){		//字母大写均变为小写
            if(isBig(S[i])) S[i] += 'a'-'A';
            ans += S[i];
            i++;
        } 
        return ans;
    }
    bool isNum(char c){
        return c>='0' && c<='9';
    }
    string maskPhone(string S){			//电话号码信息隐藏,从右到左进行处理
        int i = S.length()-1;
        int cnt=0;
        string ans;
        while(i>=0 && cnt<10){		//后10位,只有后4位保留,其余隐藏
            if(isNum(S[i])){
                if(cnt<4)   ans += S[i];
                else    ans += '*';
                cnt++;
                if(cnt==4 || cnt==7)    ans += '-';		//分隔符
            }
            i--;
        }
        ans += '-';			//考虑电话可能为12位
        while(i >= 0){
            if(isNum(S[i])) ans += '*';
            i--;
        }
        if(ans.back() == '-')   ans.pop_back();		//10位号码,则不需要-
        else    ans += '+';							//12位号码,需要+
        reverse(ans.begin(),ans.end());
        return ans;
    }
    string maskPII(string S) {
        if(S.find("@") != -1)  return maskEmail(S);		//还有@则说明是邮箱	
        else    return maskPhone(S);					//是电话
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值