非leetcode刷题记录【工程化实现类题目】—Python代码+详细注释

题目: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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值