返回介绍

solution / 0800-0899 / 0831.Masking Personal Information / README

发布于 2024-06-17 01:03:34 字数 5594 浏览 0 评论 0 收藏 0

831. 隐藏个人信息

English Version

题目描述

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

 

提示:

  • s 是一个 有效 的电子邮件或者电话号码
  • 如果 s 是一个电子邮件:
    • 8 <= s.length <= 40
    • s 是由大小写英文字母,恰好一个 '@' 字符,以及 '.' 字符组成
  • 如果 s 是一个电话号码:
    • 10 <= s.length <= 20
    • s 是由数字、空格、字符 '('')''-''+' 组成

解法

方法一:模拟

根据题目描述,我们可以先判断字符串 $s$ 是电子邮件还是电话号码,然后分别处理。

时间复杂度为 $O(n)$,空间复杂度为 $O(n)$。其中 $n$ 为字符串 $s$ 的长度。

class Solution:
  def maskPII(self, s: str) -> str:
    if s[0].isalpha():
      s = s.lower()
      return s[0] + '*****' + s[s.find('@') - 1 :]
    s = ''.join(c for c in s if c.isdigit())
    cnt = len(s) - 10
    suf = '***-***-' + s[-4:]
    return suf if cnt == 0 else f'+{"*" * cnt}-{suf}'
class Solution {
  public String maskPII(String s) {
    if (Character.isLetter(s.charAt(0))) {
      s = s.toLowerCase();
      int i = s.indexOf('@');
      return s.substring(0, 1) + "*****" + s.substring(i - 1);
    }
    StringBuilder sb = new StringBuilder();
    for (char c : s.toCharArray()) {
      if (Character.isDigit(c)) {
        sb.append(c);
      }
    }
    s = sb.toString();
    int cnt = s.length() - 10;
    String suf = "***-***-" + s.substring(s.length() - 4);
    return cnt == 0 ? suf
            : "+"
        + "*".repeat(cnt) + "-" + suf;
  }
}
class Solution {
public:
  string maskPII(string s) {
    int i = s.find('@');
    if (i != -1) {
      string ans;
      ans += tolower(s[0]);
      ans += "*****";
      for (int j = i - 1; j < s.size(); ++j) {
        ans += tolower(s[j]);
      }
      return ans;
    }
    string t;
    for (char c : s) {
      if (isdigit(c)) {
        t += c;
      }
    }
    int cnt = t.size() - 10;
    string suf = "***-***-" + t.substr(t.size() - 4);
    return cnt == 0 ? suf : "+" + string(cnt, '*') + "-" + suf;
  }
};
func maskPII(s string) string {
  i := strings.Index(s, "@")
  if i != -1 {
    s = strings.ToLower(s)
    return s[0:1] + "*****" + s[i-1:]
  }
  t := []rune{}
  for _, c := range s {
    if c >= '0' && c <= '9' {
      t = append(t, c)
    }
  }
  s = string(t)
  cnt := len(s) - 10
  suf := "***-***-" + s[len(s)-4:]
  if cnt == 0 {
    return suf
  }
  return "+" + strings.Repeat("*", cnt) + "-" + suf
}
function maskPII(s: string): string {
  const i = s.indexOf('@');
  if (i !== -1) {
    let ans = s[0].toLowerCase() + '*****';
    for (let j = i - 1; j < s.length; ++j) {
      ans += s.charAt(j).toLowerCase();
    }
    return ans;
  }
  let t = '';
  for (const c of s) {
    if (/\d/.test(c)) {
      t += c;
    }
  }
  const cnt = t.length - 10;
  const suf = `***-***-${t.substring(t.length - 4)}`;
  return cnt === 0 ? suf : `+${'*'.repeat(cnt)}-${suf}`;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文