Sword se refiere a offer-50_2. El primer carácter no repetido en el código y análisis de flujo de caracteres [Java]
1. Título
Descripción del título
Implemente una función para buscar el primer carácter que aparece solo una vez en el flujo de caracteres. Por ejemplo, cuando se leen los dos primeros caracteres "go" del flujo de caracteres, el primer carácter que aparece solo una vez es "g". Al leer los primeros seis caracteres "google" del flujo de caracteres, el primer carácter que aparece solo una vez es "l".
Descripción de salida:
si no hay ningún carácter que aparezca una vez en el flujo de caracteres actual, se devuelve el carácter #.
Dos, análisis y código
1. Tabla hash
(1) Pensando
Esta pregunta se puede resolver con la misma idea que la pregunta 50. En el proceso de ingresar el flujo de caracteres, juzgue si el personaje ha aparecido y registrado dentro de O (1) complejidad de tiempo, de modo que la complejidad general se controle en O (n) .
Esta idea se puede lograr en combinación con una tabla hash, y hay 2 puntos que se pueden optimizar:
1) El número de letras es limitado, y se puede convertir directamente en números continuos en combinación con su código ASCII, por lo que la tabla hash se puede realizar a través de una función de matriz;
2) Si se registra el número de caracteres que aparecen en la tabla hash, la posición del carácter debe recorrerse nuevamente, para que la posición del carácter se pueda registrar directamente y los caracteres repetidos Se distingue, por ejemplo, la primera Se registra la posición del carácter que aparece una vez, y la ocurrencia repetida se registra como -2, de modo que la respuesta requerida se puede obtener en un recorrido.
(2) Código
public class Solution {
int[] chars = new int[128];
int index = 1;
//Insert one char from stringstream
public void Insert(char ch)
{
if (chars[ch] == 0)
chars[ch] = index++;
else
chars[ch] = -1;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
int index = 0;
char ans = '#';
for (int i = 0; i < 128; i++)
if (chars[i] > 0 && (index == 0 || index > chars[i])) {
index = chars[i];
ans = (char)i;
}
return ans;
}
}
(3) Resultados
Tiempo de ejecución: 12 ms, memoria ocupada: 9552 k.
Tres, otro
Nada.