Hackerrank:频率查询问题获取超时错误,如何进一步优化代码?

时间:2019-12-25 10:01:04

标签: java

我在使用Java 8中的hashmap函数编写的代码中遇到超时错误。当我提交答案时,由于hackerrank平台上14个测试用例中的超时错误而导致5个测试用例失败。

下面是问题

系统会向您查询。每个查询的形式都是两个整数,如下所述:

  1. x:在数据结构中插入x。
  2. y:从数据结构中删除一次出现的y(如果存在)。
  3. z:检查是否存在频率为z的整数。如果是,则打印1否则为0。

查询以二维数组的形式给出,其中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");
    }
    }

1 个答案:

答案 0 :(得分:0)

您的代码存在问题,是Pipeline A操作。特别地,方法z具有线性时间复杂度,使得算法的整体复杂度按containsValue的顺序排列。这是一个提示:在您拥有的另一个哈希图的顶部添加另一个哈希图,该哈希图通过另一个哈希图的值来计算出现的次数。这样,您可以直接通过值查询第二个(因为在这种情况下它将是键)。