我在使用Java 8中的hashmap函数编写的代码中遇到超时错误。当我提交答案时,由于hackerrank平台上14个测试用例中的超时错误而导致5个测试用例失败。
下面是问题
系统会向您查询。每个查询的形式都是两个整数,如下所述:
查询以二维数组的形式给出,其中querys [i] [0]包含操作,而querys [i] [1]包含数据元素。
我应该如何进一步优化此代码?
static HashMap<Integer,Integer> buffer = new HashMap<Integer,Integer>();
// Complete the freqQuery function below.
static List<Integer> freqQuery(List<List<Integer>> queries) {
List<Integer> output = new ArrayList<>();
output = queries.stream().map(query -> {return performQuery(query);}).filter(v -> v!=-1).collect(Collectors.toList());
//get the output array iterate over each query and perform operation
return output;
}
private static Integer performQuery(List<Integer> query) {
if(query.get(0) == 1){
buffer.put(query.get(1), buffer.getOrDefault(query.get(1), 0) + 1);
}
else if(query.get(0) == 2){
if(buffer.containsKey(query.get(1)) && buffer.get(query.get(1))>0 ){
buffer.put(query.get(1), buffer.get(query.get(1)) - 1);
}
}
else{
if(buffer.containsValue(query.get(1))){
return 1;
}
else{
return 0;
}
}
return -1;
}
public static void main(String[] args) {
List<List<Integer>> queries = Arrays.asList(
Arrays.asList(1,5),
Arrays.asList(1,6),
Arrays.asList(3,2),
Arrays.asList(1,10),
Arrays.asList(1,10),
Arrays.asList(1,6),
Arrays.asList(2,5),
Arrays.asList(3,2)
);
long start = System.currentTimeMillis();
System.out.println(freqQuery(queries));
long end = System.currentTimeMillis();
//finding the time difference and converting it into seconds
float sec = (end - start) / 1000F;
System.out.println("FreqQuery function Took "+sec + " s");
}
}
答案 0 :(得分:0)
您的代码存在问题,是Pipeline A
操作。特别地,方法z
具有线性时间复杂度,使得算法的整体复杂度按containsValue
的顺序排列。这是一个提示:在您拥有的另一个哈希图的顶部添加另一个哈希图,该哈希图通过另一个哈希图的值来计算出现的次数。这样,您可以直接通过值查询第二个(因为在这种情况下它将是键)。