Espada se refiere a la oferta: 50_2. El primer carácter no repetido en la secuencia de caracteres: Análisis y código (Java)

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.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/109267028
Recomendado
Clasificación