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;

Cześć, społeczność. Mam tutaj jakiś problem. Staram się rozwiązać pewne zadanie i utknęłam w chwili, gdy muszę zastąpić mój ciąg w pętli. Potrzebuję nadać mojego starego ciągu na początku pętli i nadpisać ten ciąg w końcu pętli i nadaj nowy ciąg, aby rozpocząć pętlę, coś takiego, ale nie mogę tego zrobić, ponieważ po pierwszej iteracji na początku pętli, którą mogę Zobacz mój pusty ciąg. Przepraszam za mój kod gówna i złego angielskiego :)

0
Maksym Fedenko 20 lipiec 2020, 20:24

1 odpowiedź

Najlepsza odpowiedź

Istnieją inne problemy:

  1. ArrayIndexOutOfBoundsException ponieważ warunek buffer <= charsUpdate.length jest niepoprawny
  2. Zmienne buffer2 i buffer2 nie są resetowane na końcu pętli, więc po rekreacji charUpdate w ciągu 2 i następującej iteracji symbole nie są kopiowane z chars do charUpdate

Zaktualizowany i Refaktowany kod może wyglądać następująco:

    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;
    }

Ale nie jestem pewien, czy wytwarza ważne wyniki.

Prosty test pokazuje następujące wyjście:

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

Wynik:

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 lipiec 2020, 18:44