У меня есть динамический строковый класс с массивом символов text и методом reverse(), который может перевернуть содержимое массива.
Но я не понимаю логику работы алгоритма. Не могли бы вы провести меня по коду?
public void reverse() {
char tmp;
for(int i=0; i<length/2; i++) {
tmp = text[i];
text[i] = text[length-1-i];
text[length-1-i] = tmp;
}
}
Если вы не понимаете алгоритм, то лучший способ понять его — использовать ручку и бумагу и проследить шаги. Сделайте это для разных примеров, и вы поймете, что происходит.




Вы должны думать и отлаживать все шаги в цикле, как это
Char[] text ='abcd'
text.length = 4
первый шаг,
temp = 'a'
text[0] = text[3] // text[0] = 'd'
text[3] = temp // text[3] = 'a'
// your text = 'dbca'
второй шаг,
temp = 'b'
text[1] = 'c'
text[2] = 'b'
// your text = 'dcba'
Вы можете найти перевернутый текст в два раза -> размер/2
Что меня больше всего смущает в коде, так это строка text[i] = text[length-1-i];. Правильно ли я думаю, что причина, по которой длина цикла for делится наполовину, заключается в том, что он меняет местами 2 числа за раз. Последний к первому и т.д.
Вы получаете исключение arrayindexoutofboundsException, если используете text[length-i]. Поскольку массив начинается с нуля, но длина вашего текста равна array.size+1
Возьмем строку и попробуем перевернуть ее. Строка "кодер"
length = длина строки = 5 (в данном случае)
length/2 = 5/2 = 2 (это не будет 2,5, так как мы делим два целых числа)
Таким образом, цикл for идет от 0 до 2 (0,1, НЕ 2)
Когда i = 0:
temp = 'с'
text[0] теперь будет держать text[5 - 1 - 0]
так что теперь текст «родер» (промежуточный ответ)
text[4] теперь будет удерживать 'c'
Итак, теперь текст «родек»
Когда i = 1:
temp = 'о'
text[1] теперь будет держать text[5 - 1 - 1]
так что теперь текст "redec" (промежуточный ответ)
text[3] теперь будет удерживать 'o'
Итак, теперь текст «передокументирован»
Причина, по которой цикл for работает до length/2, заключается в том, что мы меняем местами символы с двух концов и останавливаемся посередине.
Надеюсь, это поможет. Попробуйте взять более длинную нить и выполните те же действия.
Большое спасибо! Теперь я понимаю, как это работает, благодаря вам. Кстати, я не просто разместил свой вопрос здесь, не пытаясь приложить усилия к тому, как это работает. Я пытался пройти алгоритм, но я просто не мог его понять.
возьмите лист бумаги и проследите значения массива и
iили используйте отладчик и выполните код построчно.