【题目】:
给定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)
题目来源:左程云老师《程序员代码面试指南》