【发布时间】:2020-02-16 15:55:43
【问题描述】:
我在 Hackerrank 上练习。好吧,这个问题非常简单,我已将其附在此处并带有示例输入。当我使用自定义输入遇到本地机器时,它按预期工作。但是,当我在其在线平台上运行时,有时 2 有时 3 个测试用例因超时异常而失败。代码在下面,任何人都可以建议需要什么改进?
这就是解决办法
public static void main(String[] args) {
int k = 3;
List<Integer> marks = new ArrayList<Integer>();
marks.add(20);
marks.add(20);
marks.add(40);
marks.add(60);
marks.add(20);
marks.add(10);
marks.add(0);
marks.add(100);
System.out.println(numofPrizes(k, marks));
}
public static int numofPrizes(int k, List<Integer> list) {
// Write your code here
Collections.sort(list, Collections.reverseOrder());
List<Integer> str = new ArrayList<Integer>();
AtomicInteger rank = new AtomicInteger(0);
AtomicInteger count = new AtomicInteger(0);
list.stream().forEach(x -> {
if(!str.contains(x)){
rank.getAndIncrement();
}
if(rank.get() <= k && x > 0){
count.getAndIncrement();
}
str.add(x);
// System.out.println("mark " + x + " rank " + rank.get() + " count " + count.get() );
});
return count.get();
}
输出:
mark 100 rank 1 count 1
mark 60 rank 2 count 2
mark 40 rank 3 count 3
mark 20 rank 4 count 3
mark 20 rank 4 count 3
mark 20 rank 4 count 3
mark 10 rank 5 count 3
mark 0 rank 6 count 3
3
【问题讨论】:
-
也许我误解了问题,但结果不应该等于
k或标记数(如果数组大小小于k)本身,不包括标记等于的人0? -
是的,纳曼,没错,见上面我已经更新了输出。
-
好吧,我相信我确实误解了这个问题,而不是要截断的数字,我认为
k表示截断排名,然后评估将获得奖励的人数。在这种情况下,使用相同的输入,如果k=4,结果将是 6。我说的对吗? -
是的,没错
-
如答案中所述,您正在浪费时间进行不必要的排序,甚至更多的是缓慢的包含。我要补充一点,您正在滥用流来完成使用普通循环可以更快、更简单地完成的事情。
标签: java performance collections java-8