leetcode
leetcode 751 ~ 800
隐藏个人信息

隐藏个人信息

难度:

标签:

题目描述

代码结果

运行时间: 26 ms, 内存: 16.2 MB


/*
 * 题目思路:
 * 1. 使用Java Stream API对输入字符串进行处理。
 * 2. 区分电子邮件和电话号码的处理逻辑。
 * 3. 对于电子邮件,转换大小写并隐藏部分字符。
 * 4. 对于电话号码,移除无关字符并格式化输出。
 */
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Solution {
    public String maskPersonalInfo(String s) {
        if (s.contains("@")) {
            // 处理电子邮件
            return IntStream.range(0, s.length())
                    .mapToObj(i -> Character.toLowerCase(s.charAt(i)))
                    .map(c -> (c == '@') ? "@" : c)
                    .collect(Collectors.collectingAndThen(Collectors.toList(), list -> {
                        String localName = list.subList(0, list.indexOf('@')).stream()
                                .map(Object::toString)
                                .collect(Collectors.joining());
                        String domainName = list.subList(list.indexOf('@') + 1, list.size()).stream()
                                .map(Object::toString)
                                .collect(Collectors.joining());
                        return localName.charAt(0) + "*****" + localName.charAt(localName.length() - 1) + "@" + domainName;
                    }));
        } else {
            // 处理电话号码
            String digits = s.chars()
                    .filter(Character::isDigit)
                    .mapToObj(c -> String.valueOf((char) c))
                    .collect(Collectors.joining());
            int localNumberLength = 10;
            String localNumber = digits.substring(digits.length() - localNumberLength);
            String countryCode = digits.substring(0, digits.length() - localNumberLength);
            return (countryCode.length() > 0 ? "+" + "*".repeat(countryCode.length()) + "-" : "") + "***-***-" + localNumber.substring(localNumber.length() - 4);
        }
    }
}

解释

方法:

该题解首先通过检查字符串s的第一个字符是字母还是数字来判断输入s是电子邮件地址还是电话号码。对于电子邮件,将其按'@'分割成名字和域名两部分,然后将这两部分转换为小写。名字的中间字母替换为五个星号,最后重组成新的电子邮件格式返回。对于电话号码,遍历字符串s,提取出所有数字形成一个新的数字列表。根据这个数字列表的长度,确定国家代码的存在并构造相应格式的电话号码。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在判断字符串是电话号码还是电子邮件时,如果字符串以数字开头但包含非法字符怎么处理?
在题解中,通过提取数字字符构建新的数字列表来处理电话号码。这种方法会自动忽略所有非数字字符,包括可能的非法字符。因此,即便输入字符串包含非法字符,只要它们不是数字,就不会影响电话号码的解析。这种处理方式确保了程序的健壮性,能够适应不规范的输入格式。
🦆
为什么在处理邮箱时选择用五个星号来替换名字中间的字符,这个选择有依据吗?
使用五个星号来替换名字中间的字符是一个常见的隐私保护措施。这个数量的星号足以隐藏原始名字的大部分细节,同时也保留了名字的首尾字符,这有助于保持一定的个人标识,而不至于完全无法识别。这种处理方式在很多服务中被广泛采用,用以平衡隐私保护和用户识别。
🦆
电话号码部分,如果数字长度不符合10-13位的标准,如何处理?是否直接返回错误,还是有其他处理方式?
题解中并没有直接处理数字长度不符合10-13位的情况。一种可能的处理方式是,如果数字长度超出或少于这个范围,可以返回一个错误信息或特定的提示,说明电话号码格式不正确。然而,从题解的代码看,它似乎设计为默认处理所有输入,即使长度不符合标准,也会尝试按照最接近的格式化方法处理。这可能引导出一种灵活但可能不精确的结果。
🦆
在提取电话号码中的数字时,如何确保处理了所有可能的分隔符,并且能正确处理混入的非法字符?
题解中通过遍历整个输入字符串,并判断每个字符是否为数字来提取电话号码中的数字。这种方法自然会忽略所有非数字字符,包括可能的分隔符和非法字符。只要字符不是数字,就不会被包含在最终的数字列表中。这样的处理保证了只有数字被提取出来,从而能有效地应对各种复杂或不规范的输入格式。

相关问题