隐藏个人信息
难度:
标签:
题目描述
代码结果
运行时间: 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位的标准,如何处理?是否直接返回错误,还是有其他处理方式?
▷🦆
在提取电话号码中的数字时,如何确保处理了所有可能的分隔符,并且能正确处理混入的非法字符?
▷