Java 在没有临时变量的情况下,将子阵列移动到同一阵列中的另一个位置

Java 在没有临时变量的情况下,将子阵列移动到同一阵列中的另一个位置,java,arrays,Java,Arrays,我可以在不使用任何临时变量的情况下将子阵列移动到同一阵列中的另一个位置吗?例如: 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 shiftArra

我可以在不使用任何临时变量的情况下将子阵列移动到同一阵列中的另一个位置吗?例如:

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];
    }
静态空移位数组(int[]数组,int i,int n,int j){
整数计数=(j-i-1)/n;
for(int p=0;p
到您的更新中
最小交换是
((j-i-1)/n)*n
,其中
i
是子数组的头索引,
j
是目标索引,
n
是子数组的长度。
实现这一目标的一个战略是:

void shiftArray(int[] array, int i, int n, int j) {
    int count = (j - i - 1)/n - 1;
    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 + 1 - n + q);
    }

}
我们已经拥有了大部分

我将重新使用他的交换方法

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];
}
另一种交换

void swap(int[] array, int i, int j) {
    if(array[i] == array[j])
        continue;
    array[i] ^= array[j];
    array[j] ^= array[i];
    array[i] ^= array[j];
}
现在,回答你的问题

input array = {1,2,3,4,5,6}
Task = Shift {2,3} to index 4
Output array = {1,4,5,6,2,3}
indx1
需要转到
indx4
indx2
需要转到
indx5

swap(array, 1, 4);
swap(array, 2, 5);

如果您需要执行两个以上的变量,请使用循环或其他方法。您还需要检查交换是否可行(不希望出现数组越界异常)。

您确定不想使用任何临时变量(这是一个任意且有点愚蠢的限制,因为编译器无论如何都会优化变量,而它只是用于交换)?或者只是您不想使用临时数组(这很合理,因为临时数组的大小几乎可以和原始数组一样大)?@hyde不,我不想使用任何临时变量。我同意编译器会优化变量,但我有兴趣在不使用显式临时变量的情况下实现它。好的,没关系。您可能想澄清您是否对数组移位感兴趣,或者只是。我想这是个转变。添加子数组移位的当前(幼稚?)实现也会有助于解决这个问题。@hyde更改了描述。因此,“没有临时变量的交换”似乎无关紧要,只是一个小细节。我感谢您提供没有临时变量的交换代码。似乎我的问题没有澄清我在寻找什么。更改问题描述。我接受您的解决方案,因为它只需很小的编辑。从count的值中删除-1,即将其更改为(j-i-1)/n。问题要求将数组移动到新索引,而不仅仅是交换提到的索引。您的解将输出{1,5,6,4,2,3}。
swap(array, 1, 4);
swap(array, 2, 5);