我可以在不使用任何臨時變量的情況下將子陣列轉移到同一陣列中的另一個位置嗎?例如:將子陣列轉移到同一陣列中的另一個位置,沒有臨時變量
input array = {1,2,3,4,5,6}
Task = Shift {2,3} to index 4
Output array = {1,4,5,6,2,3}
我能想到的唯一方法就是以某種方式使用多次交換,這可能會導致所需的輸出。我正在尋找一種可以減少掉期數量的策略。
歡迎任何其他關於如何實現這一點的建議,無論是否進行多次交換。
解決方案由@ free6om建議:
static void shiftArray(int[] array, int i, int n, int j) {
int count = (j - i - 1)/n;
for (int p = 0;p < count;p++) {
for (int q = 0;q < n;q++) {
swap(array, i + p*n + q, i + (p+1)*n + q);
}
}
for (int q = 0;q < n;q++) {
swap(array, i + count*n + q, j + q);
}
}
static void swap(int[] array, int i, int j) {
array[i] = array[i] + array[j];
array[j] = array[i] - array[j];
array[i] = array[i] - array[j];
}
你確定你不想使用*任何*臨時變量(這是一個任意的和稍微愚蠢的限制,因爲編譯器會優化變量,當它只用於交換)?還是隻是你不想使用臨時數組(這是明智的,因爲臨時數組的大小可能幾乎與原始數組一樣大)? – hyde
@hyde不,我不想使用任何臨時變量。我同意編譯器會優化變量,但我有興趣在不使用自己的顯式臨時變量的情況下實現它。 –
好的,沒關係。你可能想澄清一下,如果你對數組轉換感興趣,或者只是[this](https://en.wikipedia.org/wiki/XOR_swap_algorithm)。我認爲這種轉變。添加你當前(天真?)的子陣列轉換實現也將有助於解決這個問題。 – hyde