square不使用临时数组的索引值

时间:2017-10-27 22:41:35

标签: java arrays

在第0个索引值是4,所以我必须检查索引4处的值并将其平方并将值放在第0个索引而不使用临时数组

Index  0 1 2 3 4
Values 4 3 1 2 0
================
Result 0 4 9 1 16

现在我得到了前两个值,但最后三个值不对 我的代码如下

static void Index(int arr[], int n) {
    for(int i=0;i<n;i++) {
        int index = arr[i];
        int value = arr[index];
        arr[i]=value*value;

    }
}

以下是我得到的输出

Original Array
4 3 1 2 0 
Array after Squaring 
0 4 16 256 0 

任何人都可以帮助我,我做错了吗?

2 个答案:

答案 0 :(得分:1)

假设数字在[0, 46341)范围内,我们可以在过程中将旧值和新值存储在数组中(因为32位就足够了)。然后在第一个循环之后我们再做一个丢弃旧值并将新值平方。

// assume array[i] is within range [0, 46341) for any i
static void f(int[] array) {
    for (int i = 0; i < array.length; i++) {
        int j = array[i] & 0xffff; // get old value
        array[i] = array[j] << 16 | j; // put new and old values
    }
    for (int i = 0; i < array.length; i++) {
        int j = array[i] >>> 16; // get new value
        array[i] = j * j; // put new value squared
    }
}

答案 1 :(得分:0)

问题是您正在更改原始数组中的值。在您当前的实现中,这是您的数组在每次迭代时的更改方式:

{4, 3, 1, 2, 0} 
{0, 3, 1, 2, 0} 
{0, 4, 1, 2, 0} 
{0, 4, 16, 2, 0} 
{0, 4, 16, 256, 0}

问题是你仍然需要为每次迭代存储在原始数组中的值。因此,解决方案是保持原始数组不变,并将值放入新数组中。

    public static void index(int arr[]) {
    int[] arr2 = new int[arr.length];
    for(int i=0;i<arr.length;i++) {
        int index = arr[i];
        int value = arr[index];
        arr2[i]=value*value;
    }
}

修订过程中arr2的值:

{0, 0, 0, 0, 0} 
{0, 0, 0, 0, 0} 
{0, 4, 0, 0, 0} 
{0, 4, 9, 0, 0} 
{0, 4, 9, 1, 0} 
{0, 4, 9, 1, 16}