在第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
任何人都可以帮助我,我做错了吗?
答案 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}