簡體   English   中英

在Java中將數組的所有元素移回一個

[英]Shifting all elements of an array back one in Java

我正在編寫代碼,將數組的所有元素向后移動,並將最后一個元素移至數組的前面。

我非常希望我的程序做到這一點:

int[] array = new int[] {1, 2, 3};
// do something such that array will become {3, 1, 2}

我的代碼如下:

int[] array = new int[3];


for(int i = 0; i < array.length; i++)
{
  array[0] = 1;
  array[1] = 2;
  array[2] = 3;
  int last = array[array.length-1];
  array[i] = array[i+1];
  array[0] = last;

  System.out.println(array[i]);
}

我以為將“ 1”添加到數組的“ i”,然后將數組的最后一個元素存儲在“ last”中,然后將其分配給array [0]可以解決問題,但是我只是在{3,3}中輸出為“ java.lang.ArrayIndexOutOfBoundsException:3”。

如果您真正想要的是旋轉它(聽起來有點像它)。 使用Collections.rotate()

Collections.rotate(Arrays.asList(array), 1);

其中1是步數(距離)

如果您不想將數組轉換為列表,則可以使用這樣的簡單方法手動進行旋轉(例如)

向左走:

void rotateArrayLeftByOne(int array[])
{
    // get last index of array
    int lastIndex = array.length - 1; 
    // save first element
    int oldFirst = array[0]; 

    // copy the elements from  right to left
    for (int i = 0; i < lastIndex; i++) 
        array[i] = array[i + 1];

    // put the first element last
    array[lastIndex] = oldFirst;
}

往右走:

void rotateArrayRightByOne(int array[])
{
    // get last index of array
    int lastIndex = array.length - 1; 
    // save last element
    int oldLast = array[lastIndex]; 

    // copy the elements from  left to right
    for (int i = lastIndex; i != 0; i--) 
        array[i] = array[i - 1];

    // put the last element first
    array[0] = oldLast;
}

您可以嘗試使用以下方法:

int[] originalArray = ...
int[] shiftedArray = new int[originalArray.length];

System.arraycopy(originalArray, 0, shiftedArray, 1, originalArray.length - 1);
shiftedArray[0] = originalArray[originalArray.length - 1];

編輯建議,實際上只需要一個數組

int[] originalArray = ...
int lastItem = originalArray[originalArray.length - 1];

System.arraycopy(originalArray, 0, originalArray, 1, originalArray.length - 1);
originalArray [0] = lastItem;

您正在嘗試訪問數組中不存在的索引。 您的數組大小為3,因此2是最后一個索引。 另外,您正在for循環中進行初始化和打印。 您應該在循環之外執行這些操作。

int[] array = new int[3];

array[0] = 1;
array[1] = 2;
array[2] = 3;

for(int i = 0, previous_value = array[array.length]; i < array.length; i++)
{
  int prev = array[i];
  array[i] = previous_value;
  previous_value = prev;
}

for(int i = 0; i < array.length; i++)
{
System.out.println(array[i]);
}

具有O(1)空間和O(n)時間。

int[] array = new int[3];

for(int i = 0; i < array.length; i++) array[i] = i;

int temp = array[array.length-1];

for(int i = array.length-1; i > 0; i--) array[i] = array[i-1];

array[0] = temp;

首先,問題是您實際上正在嘗試訪問不存在的元素。 您在運行此代碼

array[i] = array[i+1];

並且“ i”變量為2,執行i +1將導致您找到不存在的array [3]。

此外,如果要進行排序,直接使用數組可能會導致內存消耗問題,因此最好使用集合,請訪問http://docs.oracle.com/javase/tutorial/collections/algorithms/,以獲得有關如何進行操作的良好教程處理這類操作

您可以從頭到尾進行迭代。 您首先要在最后創建一個空插槽,然后開始用先前的值填充空插槽。 無需創建臨時數組。 一切都准備in place

int n=3;
int[] array = new int[n];
int last = array[n-1];    //copy last element into buffer thus creating an empty slot
for(int i=n-1;i>0;i--)    //iterate from end to begin
{
   array[i] = array[i-1]; //push previous element into current location(an empty slot)
}
array[0] = last;          //finally put the last element into initial slot

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM