我正试图解决面试中心的中位数挑战。我在这里看到了一个类似的问题:interviewstreet median challenge但我想知道我的方法有什么问题。我正在使用二分搜索和一个排序的ArrayList来找出每个点的中位数。只有第1次,第3次和第10次测试通过,其余部分都因错误答案而失败。 问题:http://pastebin.com/1QhbiB2U 这是代码:
/**
* @param args
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long N = in.nextLong();
List<Long> list = new ArrayList<Long>();
for(int i=0; i<N; i++){
String op = in.next();
long number = in.nextLong();
performOperation(op, number, list);
}
}
private static void performOperation(String op, long number, List<Long> list) {
int index = Collections.binarySearch(list, number);
if(op.equalsIgnoreCase("r")){
if(index < 0){
System.out.println("Wrong!");//Doesn't exist
return;
}else{
list.remove(index);//Remove any one occurence
}
}else{
if(index < 0){
list.add(-index-1, number);//Add in sorted list
}else{
list.add(index, number);//Add where the same number exists, should still be sorted.
}
}
if(list.size() == 0){
System.out.println("Wrong!");
}else if(list.size()%2 == 0){
double median = (list.get(list.size()/2) + list.get(list.size()/2 - 1))/2.0;
if(median == Math.ceil(median))
System.out.println((long)median);
else
System.out.println(median);
}else{
System.out.println(list.get((list.size()-1)/2));
}
}
答案 0 :(得分:3)
我认为问题在于附加程序中的双打输出。 我从问题中验证了该程序的输入:
2
a 1
a 1000000000
给出:
1
5.000000005E8
这种变化适用于上述情况(虽然不是很好):
long median = (list.get(list.size()/2) + list.get(list.size()/2 - 1)); // median is multiplied by 2
if(1==(median&1))
//odd
System.out.println(""+(median/2)+".5");
else
System.out.println(median/2);
请注意,带索引的ArrayList.add为O(n)。