Dada una cadena text, solo elimine las ocurrencias duplicadas consecutivas del mismo carácter, pero las ocurrencias posteriores del mismo carácter permanecen en el resultado siempre que haya algún otro carácter entre estas ocurrencias.
Ejemplo: dado el argumento aaaabxaaddee devuelve abxade.

Esto es lo que he probado hasta ahora:

    char[] new_string = text.toCharArray();
    String result = "";

    for (int i = 1; i < text.length(); i++) {
        if (text.charAt(0) != text.charAt(i)) {
           text.charAt(0) = text.charAt(i);
           result += text.charAt(i);
        }
    }
    return res;
-1
emma.delia 10 jul. 2021 a las 19:36

5 respuestas

La mejor respuesta

Le sugiero que comience con StringBuilder siempre que desee mutar una secuencia de caracteres en Java. Aquí puede realizar un ciclo de izquierda a derecha e iniciar un segundo ciclo interno eliminando los caracteres duplicados de StringBuilder. Algo como,

public static String removeDuplicates(String text) {
    StringBuilder sb = new StringBuilder(text);
    for (int i = 0; i < sb.length() - 1;) {
        char ch = sb.charAt(i);
        int j = i + 1;
        while (j < sb.length() && sb.charAt(j) == ch) {
            sb.deleteCharAt(j);
        }
        i = j;
    }
    return sb.toString();
}

Que probé como

public static void main(String[] args) {
    System.out.println(removeDuplicates("aaaabxaaddee"));
}

Y sale (según lo solicitado)

abxade
0
Elliott Frisch 10 jul. 2021 a las 16:50

Estás comparando solo con el primer carácter. Actualice su lógica para comparar el carácter actual (en i) con el siguiente (en i + 1) y también comience su ciclo desde 0.

0
Hisham 10 jul. 2021 a las 16:43

Solo está comparando el índice 0 de la matriz de caracteres que no conducirá al resultado deseado. Además, no puede modificar la cadena con text.charAt(0) = text.charAt(i). No es válido en Java.
En su lugar, puede usar un bucle while dentro de su para loop para verificar si hay ocurrencias consecutivas. Siga comprobando si el carácter actual y el siguiente en la cadena es igual . Si son iguales, avance, de lo contrario, rompa el ciclo while y continúe con otras iteraciones.

for (int i = 0; i < text.length(); i++)
{
    result += text.charAt(i);
    while (i < text.length()-1 && text.charAt(i)==text.charAt(i+1))
        ++i;
}
0
GURU Shreyansh 10 jul. 2021 a las 16:44

Esto es bastante simple iterar sobre una cadena dada solo una vez:

public static String removeDuplicates(String str) {
    StringBuilder buf = new StringBuilder(str.length());
    char prv = '\0';

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

        if (ch != prv)
            buf.append(ch);

        prv = ch;
    }

    return buf.toString();
}
1
oleg.cherednik 10 jul. 2021 a las 17:02

Está pensando en la dirección correcta, pero en lugar de comparar cada carácter con el carácter de posición de índice 0, puede compararlo con el carácter anterior, ya que debe ignorar los consecutivos.

char[] new_string = text.toCharArray();
       String result = ""+text.charAt(0);
        for (int i = 1; i < text.length(); i++) {
        if (text.charAt(i-1) != text.charAt(i)) {
              result += text.charAt(i);
        }
      }
       return result;   
        }
     }

Nota:-

  1. "text.charAt (0) = text.charAt (i)" Esto no se puede hacer en java ya que String es una clase inmutable.
  2. Está devolviendo 'res' mientras almacena la cadena requerida en 'resultado'.
0
Sonam Gupta 10 jul. 2021 a las 17:44