到目前为止,我一直在研究这个问题。我已经迷失了一段时间,因为我不知道如何更改数组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++;
}
}
}
}
答案 0 :(得分:0)
getLineNumber
可能总是在程序中返回1(或某个值!=当前位置)。这将导致median
的行为不正确并导致程序提前终止。所以摆脱lnr
和fileLen
并将counter+1
传递给中位函数。
一些提示:
只需将break;
放在if (unChecked == 0)
之后。
对于if (unChecked != 0) ... else if (unChecked == 0)
,您可以删除if (unChecked == 0)
。
摆脱removeZeros
,功能不符合问题的要求。
对每个输入数字排序整个集合是一个坏主意,请查看insertion sort以便随时对其进行排序。