我们来定义一个函数 f(s)
,其中传入参数 s
是一个非空字符串;该函数的功能是统计 s
中(按字典序比较)最小字母的出现频次。
例如,若 s = "dcce"
,那么 f(s) = 2
,因为最小的字母是 "c"
,它出现了 2 次。
现在,给你两个字符串数组待查表 queries
和词汇表 words
,请你返回一个整数数组 answer
作为答案,其中每个 answer[i]
是满足 f(queries[i])
< f(W)
的词的数目,W
是词汇表 words
中的词。
示例 1:
输入:queries = ["cbd"], words = ["zaaaz"]
输出:[1]
解释:查询 f("cbd") = 1,而 f("zaaaz") = 3 所以 f("cbd") < f("zaaaz")。
示例 2:
输入:queries = ["bbb","cc"], words = ["a","aa","aaa","aaaa"]
输出:[1,2]
解释:第一个查询 f("bbb") < f("aaaa"),第二个查询 f("aaa") 和 f("aaaa") 都 > f("cc")。
提示:
1 <= queries.length <= 2000
1 <= words.length <= 2000
1 <= queries[i].length, words[i].length <= 10
queries[i][j]
,words[i][j]
都是小写英文字母
思路:
先把题目描述里提到的func实现了吧,
然后通过对words里的每个元素都func一下得到新的数组record,
继续对queries里的每个元素也func一下得到一个数fq,剩下的工作就是在record里找有多少个数比fq大。
本来应该写二分的,比赛的时候怕写错,直接写了O(n)也可以过……
class Solution(object):
def numSmallerByFrequency(self, queries, words):
"""
:type queries: List[str]
:type words: List[str]
:rtype: List[int]
"""
record = []
for word in words:
record.append(self.func(word))
record.sort()
# print record
n = len(record)
res = []
for q in queries:
fq = self.func(q)
cnt = 0
for num in record:
if num <= fq:
cnt += 1
else:
break
res.append(n - cnt)
return res
def func(self, word):
for char in "abcdefghijklmnopqrstuvwxyz":
t = word.count(char)
if t > 0:
return t
return 0
下面的版本是学自大神代码,
高级知识点如下:
1. func函数的实现可以直接用Counter来弄,
2. map函数可以直接把一个function apply给一个数组的全部元素,并得到生成的结果数组
3. bisect可以迅速找出一个数组里有多少个数 <= target
class Solution(object):
def numSmallerByFrequency(self, queries, words):
"""
:type queries: List[str]
:type words: List[str]
:rtype: List[int]
"""
def func2(word):
record = collections.Counter(word)
return record[min(record.keys())]
words_count = sorted(map(func2, words)) #map可以迅速对一个数组里的所有元素进行某种函数处理
queries_count = map(func2, queries)
ans = []
for query in queries_count:
index = bisect.bisect(words_count, query) #bisect可以迅速找出有index个数 <= query
ans.append(len(words_count) - index)# 减法找有多少个数比query大
return ans