Leetcode 831. Ocultar información personal

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::nposEs una variable miembro estática de std::stringtipo , 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, ssi no contiene "@"el carácter, find()el método volverá string::nposa indicar que no hay "@"carácter . Por lo tanto, el significado at != string::nposde es juzgar ssi 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:

  1. El primer parámetro es el iterador inicial del rango que se va a convertir;
  2. El segundo parámetro es el iterador final del rango que se va a convertir;
  3. El tercer parámetro es el iterador inicial donde se almacena el resultado transformado;
  4. 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 ses 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ácter sde ;
  • s.end()Indica el iterador final de la conversión, apuntando a la posición junto al último carácter sde ;
  • s.begin()Indica que el resultado de la conversión se almacena sen , es decir, conversión en el lugar;
  • ::tolowerIndica 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.

Supongo que te gusta

Origin blog.csdn.net/qq_40016005/article/details/129918973
Recomendado
Clasificación