zl程序教程

您现在的位置是:首页 >  后端

当前栏目

力扣——831. 隐藏个人信息(Java、JavaScript、python3实现耗时最短)

JAVAJavaScriptPython3 实现 隐藏 力扣 最短 个人信息
2023-09-14 09:05:31 时间
  1. 隐藏个人信息
    给你一条个人信息字符串 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” 。


示例 4:

输入:s = “86-(10)12345678”
输出:“+--**-5678”

解释:s 是一个电话号码。
共计 12 位数字,所以本地号码为 10 位数字,国家代码为 2 位数字。
因此,隐藏后的电话号码应该是 “+--**-7890” 。


在这里插入图片描述

在这里插入图片描述


Java代码1:

class Solution {
    public String maskPII(String S) {
  return (S.indexOf("@")!=-1)?maskEmail(S):maskPhone(S.toCharArray());
 }

 public String maskEmail(String s){
  StringBuilder sb = new StringBuilder();
  int index = s.indexOf("@");
  sb.append(s.charAt(0)).append("*****").append(s.charAt(index-1)).append(s.substring(index));
  return sb.toString().toLowerCase();
 }

 public String maskPhone(char[] chs){
  int cnt = 0;
  StringBuilder sb = new StringBuilder();

  for(int i=chs.length-1;i>=0;i--){
   char ch = chs[i];
   if(Character.isDigit(ch)){
    if(cnt == 4 || cnt == 7 || cnt == 10) 
       sb.append("-");
    if (cnt < 4)
     sb.append(ch);
    else
     sb.append("*");
    cnt++; 
   } 
  }

  if(cnt>10){
   sb.append('+');
  }

  return sb.reverse().toString();
 }
}

在这里插入图片描述


Java代码2:

class Solution {
    public String maskPII(String s) {
        int in = s.indexOf('@');
        if(in>0){
            s= s.toLowerCase();
            StringBuilder sb = new StringBuilder(s);
            sb.replace(1,in-1,"*****");
            s=sb.toString();
        }else{
            s=s.replace("(","");
            s=s.replace(")","");
            s=s.replace("+","");
            s=s.replace("-","");
            s=s.replace(" ","");
            int l=s.length();
            if(l==10){
                s="***-***-"+s.substring(6);
            }
            if(l==11){
                s="+*-***-***-"+s.substring(7);
            }
            if(l==12){
                s="+**-***-***-"+s.substring(8);
            }
            if(l==13){
                s="+***-***-***-"+s.substring(9);
            }
        }
        return s;   
    }
}

在这里插入图片描述


JavaScript代码:

/**
 * @param {string} S
 * @return {string}
 */
var maskPII = function(S) {
     if(S.match('@')){
        S = S.toLowerCase();
        const reg = /^[a-z]+[^@]/g;
        let name = S.match(reg)[0].split('');
        name = [name[0],'*','*','*','*','*',name[name.length - 1]].join('');
        S = S.replace(reg,name);
        return S;
    }
    S = S.replace(/\(|\)|\s|\-|\+/g,'');
    const { length } = S;
    let lastFour = S.slice(-4);
    let basicStr = `***-***-${lastFour}`;
    let remainder = length % 10;
    if(!remainder) return basicStr;
    let str = '+'.padEnd(remainder+1,'*');
    return `${str}-${basicStr}`
};

在这里插入图片描述


python3:

class Solution:
    def maskPII(self, S: str) -> str:
        i = S.find('@')
        if i >= 0:
            return S[0].lower() + '*****' + S[i - 1: ].lower()
        else:
            s = re.sub('[+() -]', '', S)
            return '***-***-' + s[-4: ] if len(s) == 10 \
                else '+' + '*' * (len(s) - 10) + '-***-***-' + s[-4: ]

在这里插入图片描述


作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习