Java- понимание логики обратного в массиве

#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