Enlace al tema: Lituo
Proporcionarle una cadena de información personal s
, que puede representar una dirección de correo electrónico o una cadena de números de teléfono . Devuelva el resultado después de ocultar información personal de acuerdo con las siguientes reglas:
dirección de correo electrónico:
Una dirección de correo electrónico consta de las siguientes partes:
- Un nombre que consta de letras inglesas mayúsculas y minúsculas seguidas de
- un
'@'
personaje seguido de - Un nombre de dominio que consta de letras inglesas mayúsculas y minúsculas y un carácter en el medio
'.'
.'.'
No será ni el primer ni el último carácter del nombre de dominio.
Para ocultar información personal de una dirección de correo electrónico:
- Las letras inglesas en mayúsculas en las partes del nombre y del nombre de dominio deben convertirse a letras inglesas en minúsculas.
- Las letras en medio del nombre (es decir, excepto la primera y la última letra) deben reemplazarse por 5
"*****"
.
número de teléfono:
Un número de teléfono debe estar formado en el siguiente formato:
- El número de teléfono puede constar de 10-13 dígitos
- Los últimos 10 dígitos constituyen el número local
- Los 0-3 dígitos restantes al frente constituyen el código de país
- Use
{'+', '-', '(', ')', ' '}
estos caracteres separadores para separar los números anteriores de alguna manera
Para ocultar información personal de un número de teléfono:
- eliminar todos los caracteres separadores
- Los números de teléfono con información personal oculta deben seguir este formato:
"***-***-XXXX"
Si el código de país tiene 0 dígitos"+*-***-***-XXXX"
Si el código de país es de 1 dígito"+**-***-***-XXXX"
Si el código del país es de 2 dígitos"+***-***-***-XXXX"
Si el código del país es de 3 dígitos
"XXXX"
son los últimos 4 dígitos del número local
Ejemplo 1:
Entrada: s = "[email protected]" Salida: "l*****[email protected]" Explicación: s es una dirección de correo electrónico. Tanto el nombre como el nombre de dominio se convierten a minúsculas y la mitad del nombre se reemplaza por 5 *.
Ejemplo 2:
Entrada: s = "[email protected]" Salida: "a*****[email protected]" Explicación: s es una dirección de correo electrónico. Tanto el nombre como el nombre de dominio se convierten a minúsculas y la mitad del nombre se reemplaza por 5 *. Tenga en cuenta que aunque "ab" tiene solo dos caracteres, aún debe haber cinco * en el medio.
Ejemplo 3:
Entrada: s = "1(234)567-890" Salida: "***-***-7890" Explicación: s es un número de teléfono. Hay 10 dígitos en total, por lo que 10 dígitos para un número local y 0 dígitos para un código de país. Por lo tanto, el número de teléfono oculto debe ser "***-***-7890".
pista:
s
es un correo electrónico o número de teléfono válido- Si
s
es un correo electrónico:8 <= s.length <= 40
s
Se compone de letras inglesas mayúsculas y minúsculas, exactamente un'@'
carácter y'.'
caracteres
- Si
s
es un número de teléfono:10 <= s.length <= 20
s
Se compone de números, espacios , caracteres'('
,')'
y'-'
'+'
Notas explicativas oficiales
class Solution {
public:
vector<string> country = {"", "+*-", "+**-", "+***-"}; // 国家代码对应的字符串数组,对应格式为"+*-***-***-XXXX"
string maskPII(string s) { // 掩盖个人信息的函数
string res;
int at = s.find("@"); // 查找邮箱地址中"@"的位置
if (at != string::npos) { // 如果是邮箱地址
transform(s.begin(), s.end(), s.begin(), ::tolower); // 将字符串转换为小写形式
return s.substr(0, 1) + "*****" + s.substr(at - 1); // 掩盖名字中间的字符
}
s = regex_replace(s, regex("[^0-9]"), ""); // 提取电话号码中的数字
return country[s.size() - 10] + "***-***-" + s.substr(s.size() - 4); // 掩盖电话号码
}
};
¿Qué hace vector<cadena>?
vector<string> es un contenedor STL en C++ para almacenar elementos de tipo cadena. Proporciona acceso aleatorio rápido y cambio de tamaño dinámico, similar a las matrices pero con mayor flexibilidad. Puede usar vector<string> country = {"", "+ -", "+ -", "+ -"}; para definir e inicializar un vector de tipo cadena.
string::npos ¿Para qué es esto?
string::npos
Es una variable miembro estática de std::string
tipo , que representa una posición de cadena no válida o inexistente. Por lo general, cuando se usa find()
el método para encontrar una determinada subcadena, si no se encuentra una subcadena coincidente, find()
el método devolverá string::npos
, que se usa para indicar la posición en la que no se encontró ninguna coincidencia. En esta pregunta, s
si no contiene "@"
el carácter, find()
el método volverá string::npos
a indicar que no hay "@"
carácter . Por lo tanto, el significado at != string::npos
de es juzgar s
si hay "@"
un carácter la cadena.
transform(s.begin(), s.end(), s.begin(), ::tolower); Explique esta función y sus parámetros
transform()
es una función de biblioteca estándar que convierte elementos en un rango específico y almacena el resultado en otro rango específico.
Específicamente, transform()
los parámetros de la función incluyen:
- El primer parámetro es el iterador inicial del rango que se va a convertir;
- El segundo parámetro es el iterador final del rango que se va a convertir;
- El tercer parámetro es el iterador inicial donde se almacena el resultado transformado;
- El cuarto parámetro es la función de conversión especificada, que puede ser un puntero de función, un objeto de función, una expresión lambda, etc.
En este tema, transform()
la función de la función s
es convertir todas las letras mayúsculas a minúsculas, el código de implementación es el siguiente:
transform(s.begin(), s.end(), s.begin(), ::tolower);
en:
s.begin()
Indica el iterador de inicio de la conversión, apuntando al primer carácters
de ;s.end()
Indica el iterador final de la conversión, apuntando a la posición junto al último carácters
de ;s.begin()
Indica que el resultado de la conversión se almacenas
en , es decir, conversión en el lugar;::tolower
Indica la función de conversión especificada, es decir, la función que convierte los caracteres en letras minúsculas. Dado que esta función es una función global, es necesario utilizar el operador de resolución de ámbito::
.
s.substr(0, 1) + "*****" + s.substr(at - 1);
Este código es para el caso de direcciones de correo electrónico, donde s es la cadena entrante. La siguiente es una explicación específica:
- s.substr(0, 1): Devuelve el primer carácter de la cadena s, que es el primer carácter del nombre de la dirección de correo electrónico.
- "*****": una cadena de 5 asteriscos para reemplazar los caracteres intermedios del nombre.
- s.substr(at - 1): Devuelve la subcadena desde el carácter en la posición - 1 en la cadena s hasta el final de la cadena, es decir, la parte del nombre de dominio de la dirección de correo electrónico.
Entonces, lo que hace todo el código es reemplazar los caracteres en medio del nombre de la dirección de correo electrónico con asteriscos, convertir las letras mayúsculas en el nombre y el nombre de dominio en letras minúsculas y finalmente devolver la cadena modificada.