#java #arrays #reverse
#java #массивы #обратное
Вопрос:
У меня есть динамический класс string, который имеет массив символов 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;
}
}
Комментарии:
1. возьмите лист бумаги и проследите значения массива и
i
или используйте отладчик и пошагово просматривайте код построчно.2. Если вы не понимаете алгоритм, то лучший способ понять это — использовать ручку и бумагу и проследить шаги. Сделайте это для разных примеров, и вы поймете, что происходит.
Ответ №1:
Давайте возьмем строку и попробуем обратить ее вспять. Строка — «coder»
length
= длина строки = 5 (в данном случае)
length/2
= 5/2 = 2 (это не будет 2.5, поскольку мы делим два целых числа) Таким образом, цикл for выполняется от 0 до 2 (0,1, А НЕ 2)
Когда i
= 0 :
temp
= ‘c’ text[0]
теперь будет выполняться text[5 - 1 - 0]
итак, теперь текст ‘roder’ (промежуточный ответ)
text[4]
теперь будет содержать ‘c’, так что теперь текст будет ‘rodec’
Когда i
= 1 :
temp
= ‘o’ text[1]
теперь будет выполняться text[5 - 1 - 1]
итак, теперь текст ‘redec’ (промежуточный ответ)
text[3]
теперь будет удерживаться ‘o’
Итак, теперь текст ‘redoc’
Причина, по которой цикл for равен till length/2
, заключается в том, что мы меняем местами символы с двух концов и останавливаемся посередине.
Я надеюсь, что это поможет. Попробуйте взять более длинную строку сейчас и выполните те же действия.
Комментарии:
1. Большое вам спасибо! Теперь я понимаю, как это работает, благодаря вам. Кстати, я не просто разместил здесь свой вопрос, не пытаясь приложить усилия к тому, как это работает. Я действительно пытался пройти через алгоритм, но я просто не мог его понять.
Ответ №2:
Вы должны продумать и отладить все шаги в цикле следующим образом
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'
Вы можете найти перевернутый текст в два раза -> size / 2
Комментарии:
1. Что меня больше всего смущает в коде, так это строка text[i] = text[длина-1-i];. Прав ли я, полагая, что причина, по которой длина forloop делится пополам, заключается в том, что он меняет местами 2 числа за раз. От последнего к первому и т.д.
2. Вы получаете arrayindexoutofboundsexception, если вы используете text[длина-i]. Потому что array начинается с нуля, но длина вашего текста равна array.size 1