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

У меня есть динамический строковый класс с массивом символов 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;
    }
 } 

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

luk2302 12.03.2019 19:16

Если вы не понимаете алгоритм, то лучший способ понять его — использовать ручку и бумагу и проследить шаги. Сделайте это для разных примеров, и вы поймете, что происходит.

Krishna 12.03.2019 19:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'

Вы можете найти перевернутый текст в два раза -> размер/2

Что меня больше всего смущает в коде, так это строка text[i] = text[length-1-i];. Правильно ли я думаю, что причина, по которой длина цикла for делится наполовину, заключается в том, что он меняет местами 2 числа за раз. Последний к первому и т.д.

Ziad Younis 12.03.2019 19:27

Вы получаете исключение arrayindexoutofboundsException, если используете text[length-i]. Поскольку массив начинается с нуля, но длина вашего текста равна array.size+1

Beyazid 12.03.2019 19:30
Ответ принят как подходящий

Возьмем строку и попробуем перевернуть ее. Строка "кодер"

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, заключается в том, что мы меняем местами символы с двух концов и останавливаемся посередине.

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

Большое спасибо! Теперь я понимаю, как это работает, благодаря вам. Кстати, я не просто разместил свой вопрос здесь, не пытаясь приложить усилия к тому, как это работает. Я пытался пройти алгоритм, но я просто не мог его понять.

Ziad Younis 12.03.2019 19:36

Другие вопросы по теме