Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用临时数组的索引处的平方值_Java_Arrays - Fatal编程技术网

Java 不使用临时数组的索引处的平方值

Java 不使用临时数组的索引处的平方值,java,arrays,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];

第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;

    }
}

有人能帮我解决我做错了什么吗?

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

{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;
    }
}

假设数字在[046341]的范围内,我们可以在这个过程中将旧值和新值存储在数组中,因为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
    }
}

不要使用标题部分进行描述,这是描述部分的目的。我已否决了此问题,因为没有证据表明对此代码执行了任何调试。请通过您的问题向我们展示您的调试发现了什么,以及有关特定代码行的特定问题。请参阅:和。好的,我将编辑现在,在你的方法中,n参数的实际用途是什么?数组的长度是:arr.length,而不是n。你当时说的是你真的不需要n。我不能使用另一个数组,这是我的代码对我无效的条件situation@Ajinkya-那么你文章的标题有点冲突,因为它说:…使用临时阵列。它是哪一个?
{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} 
// 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
    }
}