Sword se refiere al "primer personaje no repetido en la secuencia de personajes" de la serie Offer.

Implemente una función para encontrar el primer carácter que aparece solo una vez en el flujo de caracteres. Por ejemplo, cuando los dos primeros caracteres "go" se leen solo 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".

Si no hay ningún carácter que aparezca una vez en la secuencia de caracteres actual, se devuelve el carácter #.

Idea :
Al usar solo una matriz, no solo se puede juzgar si aparece varias veces en la matriz, sino también cuando aparece una vez, la matriz almacena la posición del carácter en la secuencia de caracteres por primera vez y el índice de la matriz corresponde al código ASCII del carácter Dado que el código ASCII tiene 128 caracteres, el tamaño de la matriz es 128suficiente.
  Asigne -1 al valor inicial de la matriz. Cuando un carácter aparece por primera vez, actualice -1 al índice (posición) del carácter actual en la secuencia de caracteres. Cuando aparece por segunda vez, se sobrescribe el índice asignado previamente, y no es necesario ingresar el juicio posterior, aquí la asignación se selecciona como -2). 也就是说,没出现过,数组记录-1,出现一次,数组记录位置,出现多次,数组记录成-2.
  En el método FirstAppearingOnce, tenemos que recorrer la matriz para encontrar la solución correcta, así que tenemos que hacer dos cosas:

  1. Encuentra todos los personajes que aparecen una vez, porque estamos obligados a devolver los personajes que aparecen por primera vez;
  2. Compare la posición de cada carácter que aparece una vez en el flujo de caracteres y busque el carácter que aparece primero, es decir, el personaje con la posición más pequeña. Por lo tanto, también necesita establecer una variable que registre la posición de un carácter.Cuando encuentre el siguiente carácter que aparece una vez, compare las posiciones de los dos personajes que solo aparecen una vez y vea quién está más avanzado.

En resumen, este método solo usa una matriz para registrar si un carácter aparece una vez y la posición en el flujo de caracteres cuando aparece una vez.

import java.util.*;

public class Solution {
    
    
    
    private int index = 0;
    private static int[] arr = new int[128];
    static{
    
    
        Arrays.fill(arr,-1);
    }
    //Insert one char from stringStream
    public void Insert(char ch){
    
    
        if(arr[ch] == -1){
    
    
            arr[ch] = index;
        }else if(arr[ch]>=0){
    
    
            arr[ch] = -2;
        }
        index++;
        
    }
    //return the first appearance once char in current stringStream
    public char FirstAppearingOnce(){
    
    
        int minIndex = Integer.MAX_VALUE;
        char res = '#';
        for(int i=0; i<128; i++){
    
    
            if(arr[i]>=0 && arr[i] < minIndex){
    
    
                res = (char)i;
                minIndex = arr[i];
                
            }
        }
        return res;
    }
}

Complejidad temporal: O (N)
Complejidad espacial: O (N)

Supongo que te gusta

Origin blog.csdn.net/weixin_44471490/article/details/108957215
Recomendado
Clasificación