[leetcode] 831. Masking Personal Information

441 篇文章 0 订阅
284 篇文章 0 订阅

Description

We are given a personal information string S, which may represent either an email address or a phone number.

We would like to mask this personal information according to the following rules:

  1. Email address:

We define a name to be a string of length ≥ 2 consisting of only lowercase letters a-z or uppercase letters A-Z.

An email address starts with a name, followed by the symbol ‘@’, followed by a name, followed by the dot ‘.’ and followed by a name.

All email addresses are guaranteed to be valid and in the format of “name1@name2.name3”.

To mask an email, all names must be converted to lowercase and all letters between the first and last letter of the first name must be replaced by 5 asterisks ‘*’.

  1. Phone number:

A phone number is a string consisting of only the digits 0-9 or the characters from the set {’+’, ‘-’, ‘(’, ‘)’, ’ '}. You may assume a phone number contains 10 to 13 digits.

The last 10 digits make up the local number, while the digits before those make up the country code. Note that the country code is optional. We want to expose only the last 4 digits and mask all other digits.

The local number should be formatted and masked as “***-***-1111”, where 1 represents the exposed digits.

To mask a phone number with country code like “+111 111 111 1111”, we write it in the form “+***-***-*-1111". The ‘+’ sign and the first ‘-’ sign before the local number should only exist if there is a country code. For example, a 12 digit phone number mask should start with "+-”.

Note that extraneous characters like “(”, “)”, " ", as well as extra dashes or plus signs not part of the above formatting scheme should be removed.

Return the correct “mask” of the information provided.

Example 1:

Input: "LeetCode@LeetCode.com"
Output: "l*****e@leetcode.com"
Explanation: All names are converted to lowercase, and the letters between the
             first and last letter of the first name is replaced by 5 asterisks.
             Therefore, "leetcode" -> "l*****e".

Example 2:

Input: "AB@qq.com"
Output: "a*****b@qq.com"
Explanation: There must be 5 asterisks between the first and last letter 
             of the first name "ab". Therefore, "ab" -> "a*****b".

Example 3:

Input: "1(234)567-890"
Output: "***-***-7890"
Explanation: 10 digits in the phone number, which means all digits make up the local number.

Example 4:

Input: "86-(10)12345678"
Output: "+**-***-***-5678"
Explanation: 12 digits, 2 digits for country code and 10 digits for local number. 

Notes:

  1. S.length <= 40.
  2. Emails have length at least 8.
  3. Phone numbers have length at least 10.

分析

题目的意思是:给你邮箱或者电话等个人信息,按照题目的要求进行转换。

  • 字符串处理的题目,没别的说的,直接按照规则写的暴力就行了。

代码

class Solution {
public:
    string maskPII(string S) {
        string atSign="@";
        string res="";
        if(S.find(atSign)!=string::npos){
            bool flag=false;
            for(int i=0;i<S.size();i++){
                char c=tolower(S[i]);
                if(i==0||flag){
                    res+=c;
                }else if(S[i+1]=='@'){
                    res+="*****";
                    res+=c;
                    flag=true;
                }
            }
        }else{
            int len=getNumLen(S);
            if(len>=10){
                int cnt=0;
                for(int i=0;i<S.length();i++){
                    if(isdigit(S[i])){
                        cnt++;
                    }else continue;
                    if(cnt==len-4){
                        if(cnt==6){
                            res+="***-***-";
                        }else if(cnt==7){
                            res+="+*-***-***-";
                        }else if(cnt==8){
                            res+="+**-***-***-";
                        }else{
                           res+="+***-***-***-"; 
                        }
                    }else if(cnt>len-4&&isdigit(S[i])){
                        res+=S[i];
                    }
                } 
            }
        }
        
        return res;
    }
    int getNumLen(string s){
        int cnt=0;
        for(int i=0;i<s.length();i++){
            if(s[i]>='0'&&s[i]<='9'){
                cnt++;
            }
        }
        return cnt;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值