[英]Shifting all elements in an array with one pass and no second array in 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.