原题:
设计一个支持下述操作的食物评分系统:
- 修改 系统中列出的某种食物的评分。
- 返回系统中某一类烹饪方式下评分最高的食物。
实现 FoodRatings
类:
FoodRatings(String[] foods, String[] cuisines, int[] ratings)
初始化系统。食物由foods
、cuisines
和ratings
描述,长度均为n
。foods[i]
是第i
种食物的名字。cuisines[i]
是第i
种食物的烹饪方式。ratings[i]
是第i
种食物的最初评分。
void changeRating(String food, int newRating)
修改名字为food
的食物的评分。String highestRated(String cuisine)
返回指定烹饪方式cuisine
下评分最高的食物的名字。如果存在并列,返回 字典序较小 的名字。
注意,字符串 x
的字典序比字符串 y
更小的前提是:x
在字典中出现的位置在 y
之前,也就是说,要么 x
是 y
的前缀,或者在满足 x[i] != y[i]
的第一个位置 i
处,x[i]
在字母表中出现的位置在 y[i]
之前。
我的解答采用模拟方法,即使知道可以采用最小堆使得changeRating
复杂度从O(n)下降到O(log(n))但是不会搓,这里记录两个python的语法。
默认字典:
self.menu=defaultdict(list)
当访问一个不存在的键时,会返回一个默认的空列表。同样地,参数可以替换为int(default:0)或者自定义类。
判断键是否在字典中,可以用
d = dict()
if "key" in d:
pass
来直接判断,也可以用get(key=)方法,键不存在时会返回null。
对于python,可以采用heapq模块创建一个堆,这里给出示例,也是题解:
import heapq
class FoodRatings:
def __init__(self, foods: List[str], cuisines: List[str], ratings: List[int]):
self.f={}
self.c=defaultdict(list)
for i in range(len(foods)):
self.f[foods[i]]=[cuisines[i],ratings[i]]
self.c[cuisines[i]].append((-ratings[i],foods[i]))
for i in self.c.values():
heapify(i) #从列表创建堆(最小堆)
def changeRating(self, food: str, newRating: int) -> None:
self.f[food][1]=newRating
cui=self.f[food][0]
heappush(self.c[cui],(-newRating,food)) #入堆
def highestRated(self, cuisine: str) -> str:
ans=self.c[cuisine]
while -ans[0][0]!=self.f[ans[0][1]][1]:
heappop(ans) #出堆
return ans[0][1]