1805. Número de enteros distintos en una cadena
Simple
55
negocio relacionado
Se le proporciona una cadena word
que consta de números y letras minúsculas en inglés.
Reemplace cada carácter que no sea un número con un espacio. Por ejemplo, "a123bc34d8ef34"
se convertirá en " 123 34 8 34"
. Tenga en cuenta que los números enteros restantes son (separados por al menos un espacio): "123"
, y ."34"
"8"
"34"
Devuelve el número de enteros distintosword
formados después de que el par completa la sustitución .
Dos números enteros se consideran diferentes sólo si sus representaciones decimales sin ceros a la izquierda difieren.
Ejemplo 1:
Entrada: palabra = "a 123 bc 34 d 8 ef 34 " Salida: 3 Explicación: Diferentes enteros son "123", "34" y "8". Tenga en cuenta que "34" sólo cuenta una vez.
Ejemplo 2:
Entrada: palabra = "leet 1234 código 234 " Salida: 2
Ejemplo 3:
Entrada: palabra = "a 1 b 01 c 001 " Salida: 1 Explicación: "1", "01" y "001" se consideran la representación decimal del mismo número entero porque la presencia de ceros a la izquierda se ignora al comparar números decimales. valores.
pista:
1 <= word.length <= 1000
word
Compuesto por números y letras minúsculas en inglés.
Pases
26,2K
Envíos
59,7K
Tasa de aprobación
43,9%
Solución al problema: hace algún tiempo compartí la idea de programación de la máquina de estados con mis colegas y tomé este tema para practicar. Si convierte una cadena en un número, dado que la pregunta no limita el rango del número, existe el riesgo de cruzar el límite cuando se transfiere directamente, por lo que la cadena aún se usa para el procesamiento. La idea básica es construir una máquina de estados: estado inicial-estado no válido-estado válido (el estado comienza con '0' y el estado comienza con distinto de 0), la condición de conmutación es atravesar la cadena y cambiar de acuerdo con la entrada. El valor de retorno se deduplica según las características del conjunto.
El código se muestra a continuación:
class Solution {
public:
int numDifferentIntegers(string word) {
// 状态机方法一次遍历,使用set去重
int state=0; // 0-表示无效的字母或者0,1表示遇到数字1-9了;2表示遇到0
string temstr="";
set<string> set_str;
for(auto i:word)
{
if(state==0 && i<='9' && i>'0')
{
state=1;
temstr+=i;
}
else if(state==0 && i=='0')
{
state=2;
temstr+=i;
}
else if(state==2 && i<='9' && i>'0')
{
temstr="";
state=1;
temstr+=i;
}
else if(state==2 && i=='0')
{
temstr="";
state=2;
temstr+=i;
}
else if(state==2 && (i<='z' && i>='a'))
{
set_str.insert(temstr);
state=0;
temstr="";
}
else if(state == 1 && i<='9' && i>='0')
{
state=1;
temstr+=i;
}
else if(state==1 && (i<='z' && i>='a'))
{
set_str.insert(temstr);
state=0;
temstr="";
}
else
{
continue;
}
}
if(state==1 || state==2)
set_str.insert(temstr);
return set_str.size();
}
};
C++
tiempo 0 ms
derrotar
100%
RAM6.5MB
derrotar
33,4%