-1

我试图得到每个中位数的总和......是的,这是家庭作业......我的答案是错误的,但我无法弄清楚为什么它没有给我正确的答案。有什么建议吗?

package coursera_week6_p2;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class Coursera_week6_p2 {

public static void main(String[] args) throws FileNotFoundException {
    Scanner s = new Scanner(new File("/Users/michellepai/Downloads/Median.txt"));
    int[] array = new int[10000];
    int i = 0;
    while (s.hasNextLine()) {
        array[i] = Integer.parseInt(s.nextLine());
        i++;
    }
    Arrays.sort(array);

    int m = 0;
    long med = 0;
    for (int k = 0; k < array.length; k++) {
        if (k % 2 == 0) {
            m = k/2;
        } else {
            m =(k-1)/2;
        }
        System.out.println("arrayIndex [" + k + "]: "+ array[k] +" , median index: " + m +           " , median: " + array[m]);
        med = med + array[m];
        System.out.println("total: " + med);
        }
        System.out.println(med%10000);
    }
}

这个问题的目标是实现“中值维护”算法(在第 5 周的堆应用讲座中介绍)。文本文件包含从 1 到 10000 的整数列表,未排序;您应该将其视为一串数字,一个接一个到达。设 xi 表示文件的第 i 个编号,第 k 个中值 mk 定义为数字 x1,…,xk 的中值。(所以,如果 k 是奇数,则 mk 是 x1,…,xk 中的第 ((k+1)/2) 个最小数;如果 k 是偶数,则 mk 是 x1 中的第 (k/2) 个最小数, ...,xk。)在下面的框中,您应该输入这 10000 个中位数的总和,以 10000 为模(即仅最后 4 位数字)。也就是说,你应该计算 (m1+m2+m3+⋯+m10000)mod10000。

这就是我想出来的......我终于得到了正确的答案:D

public static void main(String[] args) throws FileNotFoundException {
    Scanner s = new Scanner(new File("/Users/michellepai/Downloads/Median.txt"));
    int[] array = new int[10000];
    int i = 0;
    while (s.hasNextLine()) {
        array[i] = Integer.parseInt(s.nextLine());
        i++;
    }
    int m = 0;
    long med = 0;
    for (int k = 0; k < array.length; k++) {
        //int k = 2;
        int temp[] = new int[k + 1];
        for (int j = 0; j <= k; j++) {
            temp[j] = array[j];
        }
        Arrays.sort(temp);
        if (k % 2 == 0) {
            m = k / 2;
        } else {
            m = (k - 1) / 2;
        }

        System.out.println("arrayIndex [" + k + "]: "+ array[k] +" , median index: " + m + " , median: " + array[m]);
        med = med + temp[m];
    }
    System.out.println(med % 10000);
}
4

1 回答 1

2

我认为问题出在这里:

设 xi 表示文件的第 i 个数字,第 k 个中位数 mk 定义为数字 x1,…,xk 的中位数

根据上面的定义,mk 被定义为数字 x1,…,xk 的中位数。要计算 mk,**您应该对 x1,...,xk 进行排序,而不是对整个数组进行排序。使用后Arrays.sort(array);对整个数组进行排序,则 xk 不是文件的第 i 个编号。

于 2013-08-19T02:02:33.013 回答