0

我已经为此工作了一段时间,这是我的代码。我已经迷失了一段时间,因为我不知道如何更改数组中的项目数int m[] = new int[variable]或删除零/移动数组。零是问题所在,因为我需要对数组进行排序并找到中位数。

这是作业:

任务描述

中位数在统计领域发挥着重要作用。根据定义,它是将数组分成两个相等部分的值。在这个问题中,你要确定一些长整数的当前中位数。

假设我们有五个数字 {1,3,6,2,7}。在这种情况下,3 是中位数,因为它的每一侧正好有两个数字。{1,2} 和 {6,7}。

如果有偶数个像 {1,3,6,2,7,8} 这样的值,只有一个值不能将这个数组分成相等的两部分,所以我们考虑中间值 {3,6} 的平均值。因此,中位数将是 (3+6)/2 = 4.5。在这个问题中,您必须只打印整数部分,而不是小数部分。结果,根据这个问题,中位数将是 4!

程序输入

输入文件 (c:\codewars\prob06.in) 包含多个整数 X ( 0 <= X < 2^31 ) 并且整数总数 N 小于 10000。输入文件将包含一个“0”到表示整数列表的结尾。当您读入“0”时,您的程序必须退出而不计算数字 0 的新中位数。

1 3 4 60 70 50 2 0 

程序输出

读入每个数字后,重新计算中位数并将其显示在屏幕上。

1 2 3 3 4 27 4 

到目前为止,这是我的尝试:

import java.util.*;
import java.io.*;

public class Median {
    public static void main (String args[]) {
        
        String fileName = "textfile.txt";
        
        //Labels scanner
        Scanner inputStream = null;
        int fileLen=0;
        int[] m = new int[1000];


        try{
            inputStream = new Scanner (new File (fileName));
            LineNumberReader lnr = new LineNumberReader(new FileReader(new File(fileName)));
            lnr.skip(Long.MAX_VALUE);
            fileLen = lnr.getLineNumber();
        }
        catch(Exception e) {
            System.out.println("Could not open the file named: " + fileName);
            System.exit(0);
        }
        
        int middle = 0;

        for (int counter=0;counter<fileLen && inputStream.hasNextInt();counter++){
            
            int unChecked = inputStream.nextInt();
            if (unChecked != 0) {
                m[counter]=unChecked;
                removeZeros(m);
                median(m, fileLen);
                //Arrays.sort(m);
            }else if (unChecked == 0){
                counter+=fileLen;
            }
        }
        }
    
        
            
        
        
    
    
    
    
    public static int median(int m[],int fileLen) {
        int[] b = new int[fileLen];
        System.arraycopy(m, 0, b, 0, b.length);
        Arrays.sort(b);
        System.out.println(b[1]);
        if (m.length % 2 == 0) {
        System.out.println((b[(b.length / 2) - 1] + b[b.length / 2]) / 2);
        return (b[(b.length / 2) - 1] + b[b.length / 2]) / 2;
        } else {
        System.out.println(b[b.length / 2]);
        return b[b.length / 2];
        }
    }
    
    static void removeZeros(int m[]) {
        
        int counter2=0,counter4=0;
        for(int counter=0;counter<m.length;counter++){
            if (m[counter]!=0){
                counter2++;
                System.out.println(m[counter]);
            }
        }
        
        int d[] = new int [counter2];
        for(int counter=0;counter<m.length;counter++){
            if (m[counter]==0){
                d[counter4] = m[counter];
                counter4++;
            }
        }
            
}
}
4

1 回答 1

0

getLineNumber可能总是在您的程序中返回 1(或某个值!= 当前位置)。这将导致不正确的行为median并导致您的程序提前终止。所以摆脱lnrandfileLen并改为传递counter+1给中值函数。

一些技巧:

  • 只是放在break;后面if (unChecked == 0)

  • 对于if (unChecked != 0) ... else if (unChecked == 0),您可以删除if (unChecked == 0).

  • 摆脱removeZeros,功能不符合问题的要求。

  • 在每个输入数字上对整个集合进行排序是一个坏主意,请查看插入排序以随时对其进行排序。

于 2012-12-22T12:31:57.283 回答