在黑客排名问题中,我想计算负数。如果计数大于整数k,则必须打印no。否则,是的。我收到运行时错误。有什么方法可以更快计数?
我的代码去了
public class Solution {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
int t = s.nextInt();
for (int l = 0; l < t; l++) {
int count = 0;
int k = s.nextInt();
int n = s.nextInt();
ArrayList<Integer> al =new ArrayList();
for (int i = 0; i < n; i++) {
al.add(s.nextInt());
}
Collections.sort(al);
for (int c : al) {
if (c <= 0) {
count += 1;
} else
break;
}
if ((count >= k) || (count == k)) {
System.out.println("NO");
} else {
System.out.println("YES");
}
}
}
}
答案 0 :(得分:2)
排序^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+:\d*
为O(n log n)。用计数器在^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)*:\d*
上进行一次遍历是O(n)。如果您可以停止使用ArrayList<Integer>
读取输入内容,请不要排序,不要存储其他临时变量,请退出到达ArrayList
的那一刻退出:
k
答案 1 :(得分:0)
只需遍历您的列表,然后检查当前数字是否小于零,因此您将得到一个负数。每当这个事实成立时,就增加您的数量。简单容易!这也不是慢的,并且是处理此问题的正常方法。如果您可能拥有数万亿个数字,并且还知道集合的确切大小,则可以将集合分为不同的部分(关键字“分而治之”)。然后对自己线程中的每个部分进行此迭代。
吻-保持简单愚蠢
int count = 0;
Collection <Integer> s = null;
for(Integer i : s) {
if(i < 0)
count++;
if(count > k)
System.exit(-1);
}