使用较少的内存需要重新排序数组元素

时间:2013-08-20 18:38:33

标签: java

我最近有一个采访问题,重新排序数组中元素的内存使用量最少。不要使用任何其他变量或集合等。

输入

value   65 7 1 68 90
index    0 1 2  3  4

输出:

value   90 68 1 7 65
index    0  1 2 3  4

3 个答案:

答案 0 :(得分:5)

您可以使用XOR在元素之间进行交换(首先是最后一个,第二个是结尾的第二个,等等),如下所示:

int [] arr = {65, 7, 1, 68, 90};
for(int i=0; i<arr.length/2; i++){
    // the following 3 lines swap between elements arr[i] and arr[arr.length-i-1]
    arr[i] = arr[i] ^ arr[arr.length-i-1];
    arr[arr.length-i-1] = arr[i] ^ arr[arr.length-i-1];
    arr[i] = arr[i] ^ arr[arr.length-i-1];
}

for(int i=0; i<arr.length; i++){
    System.out.print(arr[i]+" ");
}

<强>输出

90 68 1 7 65 

答案 1 :(得分:5)

这里的主要问题是在不使用临时变量的情况下交换数组元素。您可以像这样使用XOR(^)操作:

用于交换ab

int a = 4;
int b = 5;
a ^= b
b ^= a
a ^= b

现在,您只需要将数组从index = 0迭代到index = length / 2,并在开头和结尾交换元素。

答案 2 :(得分:2)

看起来元素只是颠倒了。您可以在没有其他数组的情况下执行此操作,无论您想使用什么交换实现:

int b = 0, e = array.length-1;
while (b < e) {
    array.swap(b, e);
    b = b + 1;
    e = e - 1;
}

对于整数,你可以使用“storageless swap”通过计算总和并减去,通过XORing等。但是在制作中永远不会这样做 - 这是硬件工程师加倍时发明的无用的采访技巧作为程序员比现在更频繁(我在大约25年前看到了硬件逻辑门的问题)。