Метод обратного массива Java

1

Я пытаюсь создать метод, который принимает массив, а затем возвращает этот массив в обратном порядке. Код, который я написал, возвращает массив в обратном порядке, но первые два значения теперь равны 0. Кто-нибудь знает, что я сделал неправильно?

public static int[] reverse(int[] x)
{     
    int []d = new int[x.length];

    for (int i = 0; i < x.length/2; i++)  // for loop, that checks each array slot
    {
        d[i] = x[i];
        x[i] = x[x.length-1-i];  // creates a new array that is in reverse order of the original
        x[x.length-1-i] = d[i];
    }
    return d;      // returns the new reversed array  
}
  • 0
    Возможно, вам следует переосмыслить свое решение и попробовать свой алгоритм на бумаге, прежде чем писать какой-то код ..
  • 0
    Обратите внимание, что вы пишете прямо в x когда вы должны использовать его только для чтения данных.
Показать ещё 2 комментария
Теги:
arrays
methods
reverse

3 ответа

5

Вы присваиваете значения из неинициализированного массива d в x - это то, откуда начинаются нули (значение по умолчанию для int в Java).

IIUC, вы смешиваете две стратегии реверсирования.

Если вы создаете новый массив, вам не нужно запускать более половины исходного массива, но над всем этим:

public static int[] reverse(int[] x) {

    int[] d = new int[x.length];


    for (int i = 0; i < x.length; i++) {
        d[i] = x[x.length - 1 -i];
    }
    return d;
}

В качестве альтернативы, если вы хотите изменить массив на место, вам не нужен массив temp, только одна переменная (самое большее - есть также способы переключения двух int без дополнительной переменной, но это другой вопрос):

public static int[] reverseInPlace(int[] x) {
    int tmp;    

    for (int i = 0; i < x.length / 2; i++) {
        tmp = x[i];
        x[i] = x[x.length - 1 - i];
        x[x.length - 1 - i] = tmp;
    }
    return x; // for completeness, not really necessary.
}
  • 0
    Я изменил его для первых предложений, но что происходит, когда он печатает, первое и последнее значения переключаются, есть идеи, почему?
2

Вот короткий способ сделать это.

public static int[] reverse(int[] x)
   {

       int[] d = new int[x.length];            //create new array


       for (int i=x.length-1; i >= 0; i--)      // revered loop
       {
        d[(x.length-i-1)]=x[i];                 //setting values              

       }
        return d;                            // returns the new reversed array

   }
0

Его простая ошибка; вы справляетесь с реверсированными данными в x; и возвращение d. Если вы вернете x, вы получите полные почитаемые данные.

    d[i] = x[i];    // you are copying first element to some temp value
    x[i] = x[x.length-1-i];  // copied last element to first; and respective...
    x[x.length-1-i] = d[i]; // copied temp element to first element; and temp elements are nothing but array d

Таким образом, в конечном итоге вы создали почитаемый массив внутри x, а не d. Если вы вернете x, вы получили свой ответ. И d, который только наполовину испечен; поэтому вы получаете значение по умолчанию 0 для half-массива leftign. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню