Código para eliminar los caracteres duplicados en una cadena sin utilizar ningún búfer adicional. NOTA: Una o dos variables adicionales están bien.Una matriz extra no es:
import java.util.*;
public class Main{
public static char[] removeDupes(char[] arr){
if (arr == null || arr.length < 2)
return arr;
int len = arr.length;
int tail = 1;
for(int x = 1; x < len; x++){
int y;
for(y = 0; y < tail; y++){
if (arr[x] == arr[y]) break;
}
if (y == tail){
arr[tail] = arr[x];
tail++;
}
}
return Arrays.copyOfRange(arr, 0, tail);
}
public static char[] bigArr(int len){
char[] arr = new char[len];
Random r = new Random();
String alphabet = "[email protected]#$%^&*()-=_+[]{}|;:',.<>/?`~";
for(int x = 0; x < len; x++){
arr[x] = alphabet.charAt(r.nextInt(alphabet.length()));
}
return arr;
}
public static void main(String args[]){
String result = new String(removeDupes(new char[]{'a', 'b', 'c', 'd', 'a'}));
assert "abcd".equals(result) : "abcda should return abcd but it returns: " + result;
result = new String(removeDupes(new char[]{'a', 'a', 'a', 'a'}));
assert "a".equals(result) : "aaaa should return a but it returns: " + result;
result = new String(removeDupes(new char[]{'a', 'b', 'c', 'a'}));
assert "abc".equals(result) : "abca should return abc but it returns: " + result;
result = new String(removeDupes(new char[]{'a', 'a', 'b', 'b'}));
assert "ab".equals(result) : "aabb should return ab but it returns: " + result;
result = new String(removeDupes(new char[]{'a'}));
assert "a".equals(result) : "a should return a but it returns: " + result;
result = new String(removeDupes(new char[]{'a', 'b', 'b', 'a'}));
assert "ab".equals(result) : "abba should return ab but it returns: " + result;
char[] arr = bigArr(5000000);
long startTime = System.nanoTime();
System.out.println("2: " + new String(removeDupes(arr)));
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println("Program took: " + duration + " nanoseconds");
System.out.println("Program took: " + duration/1000000000 + " seconds");
}
}
Cómo leer y hablar sobre el código anterior:
- El método llamado removeDupes toma una matriz de char primitivo llamado arr.
- arr se devuelve como una matriz de caracteres primitivos "por valor". El archivo pasado es basura recolectada al final del método miembro de Main, removeDupes.
- La complejidad del tiempo de ejecución de este algoritmo es O (n) o más específicamente O (n + (pequeña constante)) siendo la constante los caracteres únicos en toda la matriz de caracteres primitivos.
- El copyOfRange no aumenta significativamente la complejidad del tiempo de ejecución ya que solo copia una pequeña cantidad constante de elementos. La matriz de caracteres llamada arr no tiene un paso completo.
- Si pasa null a removeDupes, el método devuelve null.
- Si pasa una matriz vacía de caracteres primitivos o una matriz que contiene un valor, se devuelve esa matriz no modificada.
- El método removeDupes se ejecuta lo más rápido posible físicamente, utilizando completamente el caché L1 y L2, por lo que Branch redirects are kept to a minimum.
- Una computadora no cargada de emisión estándar de 2015 debería ser capaz de completar este método con una matriz de caracteres primitiva que contenga 500 millones de caracteres entre 15 y 25 segundos.
explicar cómo funciona este código:
La primera parte de la matriz pasada en se utiliza como repositorio para los caracteres únicos que se devuelven en última instancia. Al comienzo de la función, la respuesta es: "los caracteres entre 0 y 1" están entre 0 y la cola.
Definimos la variable y fuera del bucle porque queremos encontrar el primer lugar en el índice de matriz que estamos viendo se ha duplicado en nuestro repositorio. Cuando se encuentra un duplicado, se rompe y se cierra, y == tail devuelve false y no se contribuye al repositorio.
cuando el índice x que estamos mirando no está representado en nuestro repositorio, luego lo jalamos y lo agregamos al final de nuestro repositorio en la cola de índice e incrementamos la cola.
Al final, volvemos la matriz entre los puntos 0 y cola, que debe ser menor o igual a la longitud de la matriz original.
Los puntos de conversación ejercicio para entrevistas codificador:
¿El programa comportarse de manera diferente si se cambia la ordenada ++ a ++ y? Por qué o por qué no.
¿La copia matriz al final representan otro pase 'N' a través de toda la matriz haciendo tiempo de ejecución complejidad O (n * n) en lugar de O (n)? Por qué o por qué no.
¿Se puede reemplazar el doble igual por la comparación de caracteres primitivos con un .equals? ¿Por qué o por qué no?
¿Puede este método puede cambiar con el fin de hacer los reemplazos "por referencia" en lugar de como es ahora, "por valor"? ¿Por qué o por qué no?
¿Se puede aumentar la eficacia de este algoritmo clasificando el repositorio de valores únicos al principio de 'arr'? ¿En qué circunstancias sería más eficiente?
hacer lo que desea a 'colapso' caracteres repetidos o eliminar duplicados por completo. Es decir, ¿debería "abba" resultar en "aba" o "ab"? –