如何修复这个Java算法?

时间:2015-03-27 01:15:10

标签: java algorithm

我已经浏览了Stack Overflow,并且自己做了一些使用此代码的工作,但无论我做什么,答案都打印为false,但它必须打印为true,我如何绘制它们的运行时间作为函数的函数他们的输入大小为散点图,然后选择大小为n的代表值,并在测试中为每个大小值n运行至少5次测试?

PrefixAverages1

import java.util.Arrays;

public class PrefixAverages1 {

static double array[] = new double[10];


public static void prefixAverages(){

for (int i = 0; i < 10; i++){

    double s = array[i];

        for (int j = 0; j < 10; j++){

            s = s + array[j];
        }

    array[i] = s / (i + 1);

    System.out.println(Arrays.toString(array));
}

}
public static double[] prefixAverages(double[] inArray) {
    double[] outArray = new double[inArray.length];
    return outArray;

}


public static void main(String... args) {
System.out.println(
   Arrays.equals(
      prefixAverages(new double[] {5, 6, 7, 8}),
      new double[] {2, 2.5, 3.5, 4}
   )
);
}
}

PrefixAverages2

import java.util.Arrays;

public class PrefixAverages2 {

static double array[] = new double[10];

public static void prefixAverages(){

        double s = 0;

        for (int i = 0; i < 10; i++){
            s = s + array[i];
            array[i] = s / (i + 1);
    }
        array[0] = 10;

    System.out.println(Arrays.toString(array));
}

public static double[] prefixAverages(double[] inArray) {
double[] outArray = new double[inArray.length];
return outArray;

}


public static void main(String... args) {
System.out.println(
   Arrays.equals(
      prefixAverages(new double[] {3, 4, 5, 6}),
      new double[] {2, 3.5, 4, 5}
   )
);
}

}

3 个答案:

答案 0 :(得分:0)

我猜测因为很难理解你想要做什么。但是现在我甚至不确定这段代码是如何编译的,因为你还没有定义任何构造函数,而你(显然是试图)调用一个构造函数(具有相同的静态类函数名称,令人困惑)和坏形式)与数组参数。我想猜测你打算调用带有double []参数的静态方法。 (现在,这里是令人困惑的部分,它不应该编译,因为你应该必须在类名前加上调用静态函数。)。但是,即使这样也会失败,因为 方法会返回与输入数组长度相同的数组。最重要的是,&#34;算法&#34;您的代码部分甚至从未调用

我建议在调试器中单步执行此操作。通过这种方式,您可以实时查看代码正在执行的操作,并在不符合您的意思时对其进行更正。

此外,如果你遵循正常的编码约定(永远不要在类之后命名函数;只有构造函数),那么更容易发现这样的错误。

编辑:我现在看它是如何编译的。尽管如此,在课程之后命名这个函数让我想到了#34; constructor&#34;以及这个星球上的其他人。

答案 1 :(得分:0)

首先,您必须了解Arrays.equals()方法的作用。 Arrays.equals()方法根据内容对两个数组进行比较操作;不是基于他们的大小。首先,让我们看一下你的prefixAverages(float [] inArray)方法。你在那里做的只是创建一个大小等于传递数组大小的新浮点数组,然后返回新创建的数组。在main方法中,您将比较返回的数组和您提供的新数组。但这在逻辑上是不正确的。由于返回的数组是一个空数组; Arrays.equals()方法返回false,因为另一个数组中有一些值。即使返回的数组确实有一些值,如果两个值都包含不同的值,则Arrays.equals()方法返回false。 始终记住两个数组相等,当且仅当它们包含相同的值并且元素应该是相同的顺序时。 **像这样修改您的程序,它将返回** true

import java.util.Arrays;

public class PrefixAverages1 {

static double array[] = new double[10];


public static void prefixAverages(){

for (int i = 0; i < array.length; i++){

    double s = array[i];

        for (int j = 0; j < array.length; j++){

            s = s + array[j];
        }

    array[i] = s / (i + 1);

    System.out.println(Arrays.toString(array));
}

}
public static double[] prefixAverages(double[] inArray) {   
    double [] outArray = inArray;
    return outArray;

}


public static void main(String... args) {
System.out.println(
   Arrays.equals(
      prefixAverages(new double[] {5, 6, 7, 8}),
      new double[] {5, 6, 7,8}      
   )
);
}
}

还有一件事。在循环中使用数组;始终使用array.length方法进行比较条件检查。否则,ArrayOutOfBoundsException条件的概率发生了很大的变化。

答案 2 :(得分:0)

您期望的输出不正确;对于输入5, 6, 7, 8,前缀平均值应为5.0, 5.5, 6.0, 6.5

在第一个值5之后,有一个值(5)。在第二个值(6 + 5)之后,有两个值11(而11 / 25.5)。然后6(因为6+5+718)而18/36。最后18+82626/46.5

static double[] prefixAverages(double[] x) {
    int len = x.length;
    double[] arr = new double[len];
    double sum = 0;    
    for (int i = 0; i < len; i++) {
        sum += x[i];
        arr[i] = sum / (i + 1);
    }
    System.out.println(Arrays.toString(arr));
    return arr;
}