public static String decrypt(final String encryptedText, final int n) {


    char [] chars;
    String s = encryptedText;
    String s1 = "";
    int buffer = 0;
    int buffer2 = 1;

    for (int j = 0; j < n; j++) {
        if (j < 1){
            chars = s.toCharArray();
        }else{
            chars = s1.toCharArray();
        }
        char [] charsUpdate = new char[chars.length];

        for (int i = chars.length / 2; i < chars.length; i++) {
            if (buffer % 2 == 0 && buffer <= charsUpdate.length){
                charsUpdate[buffer] = chars[i];
            }
            buffer += 2;
        }
        for (int i = 0; i < chars.length / 2 ; i++) {
            if (buffer2 % 2 != 0 && buffer2 < charsUpdate.length){
                charsUpdate[buffer2] = chars[i];
            }
            buffer2 += 2;
        }
        s = "";
        s1 = "";
        for (int i = 0; i < charsUpdate.length; i++) {
            s = s + charsUpdate[i];
        }
        s1 = s;
    }
    return s;

Hola comunidad. Tengo algun problema aqui. Intento resolver alguna tarea y me he quedado atascado en el momento en el que necesito sobrescribir mi String en bucle. Necesito dar mi cadena anterior al inicio del bucle y sobrescribir esta cadena al final del bucle y dar una nueva cadena al inicio del bucle, algo así, pero no puedo hacer esto, porque después de la primera iteración en el inicio del bucle puedo ver mi cadena vacía. Perdón por mi código de mierda y mi mal inglés :)

0
Maksym Fedenko 20 jul. 2020 a las 20:24

1 respuesta

La mejor respuesta

Hay algunos otros problemas:

  1. ArrayIndexOutOfBoundsException porque la condición buffer <= charsUpdate.length es incorrecta
  2. Las variables buffer y buffer2 no se restablecen al final del ciclo, por lo que después de la recreación de la matriz charUpdate durante la segunda y la siguiente iteración, los símbolos no se copian de chars a charUpdate

El código actualizado y refactorizado puede tener el siguiente aspecto:

    public static String decrypt(final String encryptedText, final int n) {
        int len = encryptedText.length();
        int half = len / 2;
        String s = encryptedText;

        for (int j = 0; j < n; j++) {
            char[] chars = s.toCharArray();

            char[] charsUpdate = new char[len];

            for (int i = half, even = 0; i < len && even < len; i++, even += 2) {
                charsUpdate[even] = chars[i];
            }
            for (int i = 0, odd = 1; i < half && odd < len; i++, odd += 2) {
                charsUpdate[odd] = chars[i];
            }
            s = new String(charsUpdate);
        }
        return s;
    }

Pero no estoy seguro de que produzca resultados válidos.

Una prueba simple muestra el siguiente resultado:

for (int i = 1; i < 5; i++) {
    System.out.println("abcdefgh (" + i + ") -> " + decrypt("abcdefgh", i));
}

Salida:

abcdefgh (1) -> eafbgchd
abcdefgh (2) -> gecahfdb
abcdefgh (3) -> hgfedcba
abcdefgh (4) -> dhcgbfae
----
// for odd length of the input string
abcdefg (1) -> daebfcg
abcdefg (2) -> bdfaceg
abcdefg (3) -> abcdefg
abcdefg (4) -> daebfcg
1
Alex Rudenko 20 jul. 2020 a las 18:44