我试图在Java中找到输入流中的中位数。在每次用户输入之后,应该有一个输出更新新的中位数。例: 在读取流5的第1个元素后,中位数为5 在读取流5的第2个元素后,15个中值为10 在读取流5的第3个元素后,15,1个中值为5 在读取流5的第4个元素后,15,1,3中位数为4,所以
这是我的代码到目前为止,但它不适用于过去4的输入。
public static void main(String[] args){
Scanner s = new Scanner(System.in);
System.out.print("Enter a integer for number of streams: ");
int n=s.nextInt();
int[] x=new int[n];
for(int i=0;i<n;i++) {
System.out.println("Enter a integer: ");
x[i]=s.nextInt();
if(i==0) { //first input number
System.out.println(x[i]+" goes to stream --> Median is: "+x[i]);
}
else if(i==1) { //when i =1, it is technically second input
System.out.println(x[i]+" goes to stream --> Median is: "+(float)(x[i]+x[0])/2);
}
else if(i>=2 && i%2==0) { //3rd input so # of inputs is odd
Arrays.sort(x);
System.out.println(x[i]+" goes to stream --> Median is: "+x[n/2]);
}
else if(i>=3 && i%2!=0) { //when # of input is more than 3 and even
Arrays.sort(x);
int j=n/2;
float med=(x[j]+x[j-1])/2;
System.out.println(x[i]+" goes to stream --> Median is: "+med);
}
我还没有完成,但我的问题是:这种方法有效吗?基本上我只是使用迭代器i来查看输入的数量是奇数还是偶数。如果是奇数,则对输入数组进行排序,找到中间的#。如果均匀,找到中间2并添加和分割。我已经看过使用堆等的其他解决方案,但我只是严格使用数组。
答案 0 :(得分:2)
你的代码看起来还不错,显然它可以改进,因为它是一种天真的方法。
我在您的解决方案中看到的错误是您在第3和第4 n
块中使用i
(完整数组的长度)而不是else-if
(当前长度)
此外,使用ArrayList而不是Array,因为数组被初始化为其默认值(此处为0),因为您输出错误。
尝试使用以下更正:
public static void main(String[] args){
Scanner s = new Scanner(System.in);
System.out.print("Enter a integer for number of streams: ");
int n=s.nextInt();
List<Integer> x = new ArrayList<>();
for(int i=0;i<n;i++) {
System.out.println("Enter a integer: ");
x.add(s.nextInt());
if(i==0) { //first input number
System.out.println(x.get(i)+" goes to stream --> Median is: "+x[i]);
}
else if(i==1) { //when i =1, it is technically second input
System.out.println(x.get(i)+" goes to stream --> Median is: "+(float)(x.get(i)+x.get(0))/2);
}
else if(i>=2 && i%2==0) { //3rd input so # of inputs is odd
Collections.sort(x);
System.out.println(x.get(i)+" goes to stream --> Median is: "+x.get(i/2));
}
else if(i>=3 && i%2!=0) { //when # of input is more than 3 and even
Collections.sort(x);
int j=i/2;
float med=(x.get(j)+x.get(j-1))/2;
System.out.println(x.get(i)+" goes to stream --> Median is: "+med);
}
}
}
现在,让我们谈谈时间的复杂性。
正如我上面所说的天真的方法。下一步可以是提高时间复杂度,这可以通过使用数据结构来存储元素来完成,这些元素在每次新添加时自行排序,而不是每次排序。我的意思是,如果我们使用某种SortedList
。
但是,在java中没有像SortedList
这样的类。但是有一类基于类似的概念,即 PriorityQueue 。我建议你阅读它并尝试自己降低复杂性。