реверсирование строки с использованием массива символов - PullRequest
0 голосов
/ 01 мая 2018

Я знаю, как перевернуть строку, но я просто пытался найти альтернативный способ сделать то же самое, используя массив символов. Просто скажите мне, почему приходит неправильный вывод? имеет строку

char[] c = a.toCharArray();
int j = c.length;
char c2[] = c;
for(int i = 0; i < j; i++){
    c2[i] = c[j - i - 1];
}
System.out.println(c2);

как дает гарольд дает выход dloold

Ответы [ 5 ]

0 голосов
/ 01 мая 2018

Как уже упоминалось в других ответах, вы должны остановиться на полпути через массив.

Я просто хотел бы добавить, что в Java есть метод StringBuilder.reverse () , который также работает с массивом символов на месте. Следующее адаптировано из официального исходного кода:

private static String reverse(String s) {
    char[] chars = s.toCharArray();
    int length = s.length();
    for (int j = (length-1) / 2; j >= 0; j--) {
        int k = length - j - 1;
        char cj = chars[j];
        char ck = chars[k];
        chars[j] = ck;
        chars[k] = cj;
    }
    return new String(chars);
}
0 голосов
/ 01 мая 2018

Ваше назначение char c2[]=c; назначает ссылку c на c2. Вы должны создать массив такой же длины с c.

Так что вы должны либо написать;

char c2[] = new char[j];

или

char c2[] = a. toCharArray()

для создания массива с разностной ссылкой в ​​памяти.

0 голосов
/ 01 мая 2018

Вы читаете и пишете в один и тот же массив. Это:

char c2[]=c;

не правильно

Вы хотите:

   char c2[]= new char[c.length];
0 голосов
/ 01 мая 2018

Это справочная проблема.

char c2[]=c;

Это не копирует массив, только его ссылку. Итак, c2 и c - это одинаковые массивы. В вашем цикле вы переопределяете первые символы с последними. Самое простое решение - использовать:

char c2[]= new char[j];

Итак, у вас есть два массива и нет проблем со ссылками.

Альтернативно вы можете поменять массив на месте. Проходите по ней до конца и меняйте местами элементы первой и второй половины.

0 голосов
/ 01 мая 2018

Нет необходимости использовать два массива, и когда вы делаете эталонную копию, вы все равно работаете с одним и тем же массивом.

Не забудьте протестировать свой алгоритм, используя пустой массив, ноль, массив с четной длиной и один с нечетной длиной.

Вот решение с одним массивом, включающее простые тестовые отпечатки.

public class ReverseTest {
    public static String reverse(String s) {
        if (s == null)
            return null;
        char[] ca = s.toCharArray();
        for (int i = 0; i < ca.length/2; i++) {
            int j = ca.length-i-1;
            char c = ca[i];
            ca[i] = ca[j];
            ca[j] = c; 
        }
        return String.valueOf(ca);
    }

    public static void main(String[] args) {
        System.out.println(reverse(null));
        System.out.println(reverse(""));
        System.out.println(reverse("54321"));
        System.out.println(reverse("4321"));
    }
}

Печать:

1010 * нуль *

empty line

12345

1234

...