题目:731. 我的日程安排表 II
难度:中等
算法:数组区间比较
# 2022.07.20
class MyCalendarTwo:
def __init__(self):
self.booked = [] # 预定过的有效区间
self.duplicate = [] # 预定两次的区间
def book(self, start: int, end: int) -> bool:
# 如果跟两次重合的重合了,返回false
if any(start < e and end > s for (s, e) in self.duplicate):
return False
# 如果跟一次的重合了,把重合部分加入两次重合list
for (s, e) in self.booked:
if start < e and end > s:
self.duplicate.append((max(start, s), min(end, e)))
# 没丢弃的都记录下来跟后面的继续比较
self.booked.append((start, end))
return True
# Your MyCalendarTwo object will be instantiated and called as such:
# obj = MyCalendarTwo()
# param_1 = obj.book(start,end)
题目:592. 分数加减运算
难度:中等
算法:分数加减运算
# 2022.08.09
class Solution:
def fractionAddition(self, expression: str) -> str:
i, n = 0, len(expression)
numerator_tmp, denominator_tmp = 0, 1
while i < n:
# 1. 读分子
numerator = 0
sign = 1
if expression[i] == "+" or expression[i] == "-":
if expression[i] == "-":
sign = -1
i += 1
while i < n and expression[i].isdigit():
numerator = numerator * 10 + int(expression[i])
i += 1
# sign放在这里成才行,不能放在后面final的地方
numerator = sign * numerator
# 这里遇到/符号,直接+1跳过,也跳出分子的循环
i += 1
# 2. 读分母
denominator = 0
while i < n and expression[i].isdigit():
denominator = denominator * 10 + int(expression[i])
i += 1
# 3. 分子分母通分
numerator_tmp = numerator * denominator_tmp + denominator * numerator_tmp
denominator_tmp *= denominator
# 4. 找公约数后各自除以公约数
gcd1 = gcd(numerator_tmp, denominator_tmp)
numerator_tmp = numerator_tmp//gcd1
denominator_tmp = denominator_tmp//gcd1
ans = str(numerator_tmp) + "/" + str(denominator_tmp)
return ans
外部题
# class Solution:
# def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
# self.record_dict = collections.defaultdict(list)
# self.count = 0
class SkiRankingSystem:
def __init__(self):
self.record_dict = collections.defaultdict(list)
self.count = 0
# addRecord(int userId, int duration)
# 添加一条滑雪记录,同一个userId可以添加多条滑雪记录
def add_record(self, user_id: int, duration: int) -> None:
self.count += 1
self.record_dict[user_id].append((duration, self.count))
self.record_dict[user_id].sort()
# int[] getTopAthletes(int num)
# 返回滑雪最快的前num个运动员,用数组返回,按照滑雪时间由低往高排,如果时间相同则按照记录的先后顺序返回
def get_top_athletes(self, num: int) -> List[int]:
athletes = sorted(self.record_dict.items(), key=lambda item: (item[1][0][0], item[1][0][1]))
# item[1]是取value,因为item[0]是key
# item[1][0]是取每个运动员最小的duration,因为前面记录的时候把最小的duration排最前面了
# item[1][0][0]是最小时长记录的duration,item[1][0][1]是最小时长记录的记录顺序,对应题目中“如果时间相同则按照记录的先后顺序返回”的要求
result = []
for i in athletes[:num]:
result.append(i[0])
print("get_top_athletes:", result)
print("athletes:",athletes)
return result
# int[] queryTop3Record(int userId)
# 返回一个运动员滑得最快的3次记录,(注意此处的数据可以重复,同一个运动员可以多次滑雪时间相同,如果相同也需要返回)
def query_top3_record(self, user_id: int) -> List[int]:
record = self.record_dict[user_id][:3]
print("query_top3_record:", record)
return [i[0] for i in record]
# 用例
add_record(self, 1, 5)
add_record(self, 1, 33)
add_record(self, 1, 22)
add_record(self, 1, 44)
add_record(self, 2, 8)
add_record(self, 3, 44)
add_record(self, 4, 11)
add_record(self, 4, 5)
print("list1:", self.record_dict)
get_top_athletes(self, 4)
add_record(self, 3, 8)
query_top3_record(self, 1)
print("list2:", self.record_dict)
# stdout
# list1: defaultdict(<class 'list'>, {1: [(5, 1), (22, 3), (33, 2), (44, 4)], 2: [(8, 5)], 3: [(44, 6)], 4: [(5, 8), (11, 7)]})
# get_top_athletes: [1, 4, 2, 3]
# athletes: [(1, [(5, 1), (22, 3), (33, 2), (44, 4)]), (4, [(5, 8), (11, 7)]), (2, [(8, 5)]), (3, [(44, 6)])]
# query_top3_record: [(5, 1), (22, 3), (33, 2)]
# list2: defaultdict(<class 'list'>, {1: [(5, 1), (22, 3), (33, 2), (44, 4)], 2: [(8, 5)], 3: [(8, 9), (44, 6)], 4: [(5, 8), (11, 7)]})
# 输入示例1:
# SkiRankingSystem sys = new SkiRankingSystem();
# sys.addRecord(1, 10);
# sys.addRecord(2, 8);
# sys.getTopAthletes(3); 返回[2,1]
# sys.queryTop3Record(1); 返回[10]
# 输入示例2:
# SkiRankingSystem sys = new SkiRankingSystem();
# sys.addRecord(20, 8);
# sys.addRecord(22, 6);
# sys.addRecord(20, 6);
# sys.getTopAthletes(4);#返回[22, 20];
# sys.addRecord(33, 5);
# sys.addRecord(22, 9);
# sys.addRecord(31, 4);
# sys.getTopAthletes(4);#返回[31, 33, 22, 20];
# sys.addRecord(20, 8);
# sys.queryTop3Record(20);#返回[6, 8, 8]
# sys.addRecord(20, 6);
# sys.queryTop3Record(20);#返回[6, 6, 8]