9.29 出现次数的TOP K问题

题目】:

  给定String类型的数组strArr,再给定整数k,请严格按照排名顺序打印出现次数前k名的字符串

  举例:

    strArr=["1","2","3","4"],k=2

    No.1:1, times:1

    No.2:2, times:1

    这种情况下,所有的字符串都出现一样多,随便打印任何两个字符串都可以

    strArr=["1","1","2","3"],k=2

    输出:

    No.1:1, times:2

    No.2:2,times:1

    或者输出:

    No.1:1, times:2

    No.2:3, times:1

要求】:

  如果strArr长度为N,时间复杂度清达到O(Nlogk)

进阶题目】:

  设计并实现TopKRecord结构,可以不断地向其中加入字符串,并且可以根据字符串出现的情况随时打印加入次数最多前k个字符串,具体为:

  1、k在TopKRecord实例生成时指定,并且不再变化(k是构造函数的参数)

  2、含有add(String str)方法,即向TopKRecord中加入字符串

  3、含有printTopK()方法,即打印加入次数最多的前k个字符串,打印有哪些字符串和对应的次数即可,不要求严格按照排名顺序打印

  举例:

    TopKRecord record = new TopKRecord(2);  // 打印Top2的结构

    record.add("A");

    record.printTopK();

    此时打印:

      TOP:

      Str: A Times: 1

    record.add("B");

    record.add("B");

    record.printTopK();

    此时打印:

      TOP:

      Str: A Times: 1

      Str: B Times: 2

    或者打印:

      TOP:

      Str: B Times: 2

      Str: A Times: 1

    record.add("C");

    record.add("C");

    record.printTopK();

    此时打印:

      TOP:

      Str: B Times: 2

      Str: C Times: 2

    或者打印:

      TOP:

      Str: C Times: 2

      Str: B Times: 2

要求】:

  1、在任何时刻,add方法的时间复杂度不超过O(logk)

  2、在任何时刻,printTopK方法的时间复杂度不超过O(k)

题目来源:左程云老师《程序员代码面试指南》

猜你喜欢

转载自www.cnblogs.com/latup/p/10205225.html
今日推荐