力扣每日一题(五十六——周末比赛题目)

仅以此纪录每日LeetCode所刷题目(这个周末有一场力扣杯、一场周赛、一场双周赛,真是猪脑过载)。

题目描述:

力扣每日一题(五十六——周末比赛题目)_第1张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第2张图片

思路:

这道题我们直接模拟即可,需要注意在计算宝石的一半时,需要向下取整。

代码:

class Solution:
    def giveGem(self, gem: List[int], operations: List[List[int]]) -> int:
        for i in range(len(operations)):
            a = gem[operations[i][0]] // 2
            gem[operations[i][0]] -= a
            gem[operations[i][1]] += a
        a = sorted(gem)
        return a[-1] - a[0]

题目描述:

力扣每日一题(五十六——周末比赛题目)_第3张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第4张图片

思路:

这道题测试用例的范围是0-8,而且题目也明确提示了一道菜只能使用一遍,不能重复使用。因此我们可以使用暴力解法,将所有的可能依次进行枚举,在满足饱腹的情况下返回最大的美味度。

力扣每日一题(五十六——周末比赛题目)_第5张图片

这是我在之前的博客中写到的一个库函数,作用是用来进行枚举。在本题中使用过。 

代码:

class Solution:
    def perfectMenu(self, materials: List[int], cookbooks: List[List[int]], attribute: List[List[int]], limit: int) -> int:
        length = len(cookbooks)
        data = []
        b_arr = []
        max_arr = []
        for i in range(length):
            data.append(i)
        for i in range(len(data)):
            for j in combinations(data, i+1):
                count = [0]*len(materials)
                b = 0
                m = 0
                for w in j:
                    b += attribute[w][1]
                    m += attribute[w][0]
                    for k in range(len(materials)):
                        count[k] += cookbooks[w][k]
                for a in range(len(count)):
                    if count[a] > materials[a]:
                        break
                    if a == len(count)-1:
                        max_arr.append(m)
                        b_arr.append(b)
        if max_arr == []:
            return -1
        max_return = 0
        for i in range(len(b_arr)):
            if b_arr[i] >= limit and max_arr[i] > max_return:
                max_return = max_arr[i]
        if max_return == 0:
            return -1
        else:
            return max_return

题目描述:

力扣每日一题(五十六——周末比赛题目)_第6张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第7张图片

力扣每日一题(五十六——周末比赛题目)_第8张图片

思路:

真不太会 以后再研究 要睡觉了

代码:

class Solution:
    def getNumber(self, root: Optional[TreeNode], ops: List[List[int]]) -> int:
        lst=[]
        def order(root):
            if not root:
                return 
            order(root.left)
            lst.append(root.val)
            order(root.right)
        order(root)
        
        red_set=0
        for i in ops[::-1]:
            start,end=i[1],i[2]
            b1=bisect_left(lst,start)
            b2=bisect_right(lst,end)
            if i[0]==1:
                red_set+=b2-b1
            lst=lst[:b1]+lst[b2:]
        return red_set

题目描述:

力扣每日一题(五十六——周末比赛题目)_第9张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第10张图片

思路:

这道题直接进行枚举即可,排除一种铅笔和钢笔都买不起的情况,我们返回1。其余的我们依次计算买不同的钢笔情况下能买铅笔的个数,要注意买0支也是一种情况,因此不要少算1。返回结果即可。

代码:

class Solution:
    def waysToBuyPensPencils(self, total: int, cost1: int, cost2: int) -> int:
        if cost1 > total and cost2 > total:
            return 1
        else:
            a = total // cost1
            list1 = []
            for i in range(a+1):
                b = (total - (i*cost1))//cost2
                list1.append(b+1)
            count = 0
            for j in list1:
                count += j
            return count

题目描述:

力扣每日一题(五十六——周末比赛题目)_第11张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第12张图片

思路:

我在类中存储了一个整数变量来表示ATM机器中的余额,这样可以快速判断是否能取钱。同时存放了一个长度为五的一维数组,里面表示不同面值钞票的剩余数量。在取钱函数中我们需要注意的是:即使余额够,但是因为钞票的数额可能不能满足我们想取出来的数额,所以有的取钱操作不能正常的进行。

代码:

class ATM:
    def __init__(self):
        self.count = 0
        self.a = [0,0,0,0,0]
    def deposit(self, banknotesCount: List[int]) -> None:
        for i in range(5):
            self.a[i] += banknotesCount[i]
        self.count += 20*banknotesCount[0] + 50*banknotesCount[1] + 100*banknotesCount[2] + 200*banknotesCount[3] + 500*banknotesCount[4]
    def withdraw(self, amount: int) -> List[int]:
        if self.count >= amount:
            self.count -= amount
            a4 = amount // 500
            if self.a[4] >= a4:
                self.a[4] -= a4
                amount -= a4*500
            else:
                a4 = self.a[4]
                amount -= self.a[4]*500
                self.a[4] = 0

            a3 = amount // 200
            if self.a[3] >= a3:
                self.a[3] -= a3
                amount -= a3*200
            else:
                a3 = self.a[3]
                amount -= self.a[3]*200
                self.a[3] = 0
                
            a2 = amount // 100
            if self.a[2] >= a2:
                self.a[2] -= a2
                amount -= a2*100
            else:
                a2 = self.a[2]
                amount -= self.a[2]*100
                self.a[2] = 0

            a1 = amount // 50
            if self.a[1] >= a1:
                self.a[1] -= a1
                amount -= a1*50
            else:
                a1 = self.a[1]
                amount -= self.a[1]*50
                self.a[1] = 0

            a0 = amount // 20
            if self.a[0] >= a0:
                self.a[0] -= a0
                amount -= a0*20
            else:
                a0 = self.a[0]
                amount -= self.a[0]*20
                self.a[0] = 0

            if amount > 0:
                self.a[0] += a0
                self.a[1] += a1
                self.a[2] += a2
                self.a[3] += a3
                self.a[4] += a4
                self.count += a0*20+a1*50+a2*100+a3*200+a4*500
                return [-1]
            return [a0,a1,a2,a3,a4]
        else:
            return [-1]

题目描述:

力扣每日一题(五十六——周末比赛题目)_第13张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第14张图片

思路:

这道题直接模拟即可。

代码:

class Solution:
    def digitSum(self, s: str, k: int) -> str:
        while True:
            length = len(s)
            if length <= k:
                return s
            list1 = []
            if length % k == 0:
                for i in range(length // k):
                    list1.append(s[k*i:k*i+k])
            else:
                for i in range((length // k) + 1):
                    list1.append(s[k*i:k*i+k])
            list2 = []
            for j in list1:
                count = 0
                for a_k in j:
                    count += int(a_k)
                list2.append(str(count))
            s = ""
            for a in list2:
                s += a

题目描述:

力扣每日一题(五十六——周末比赛题目)_第15张图片

示例:

力扣每日一题(五十六——周末比赛题目)_第16张图片

思路:

这道题首先使用字典将每个任务对应的个数进行存储,若出现只有一次的任务,则返回-1,依次遍历字典中的任务,如下代码是比较容易理解的。

代码:

class Solution:
    def minimumRounds(self, tasks: List[int]) -> int:
        dict1 = {}
        for i in tasks:
            if i in dict1:
                dict1[i] += 1
            else:
                dict1[i] = 1
        count = 0
        for i in dict1:
            if dict1[i] == 1:
                return -1
            while dict1[i] > 0:
                if dict1[i] == 2:
                    dict1[i] -= 2
                    count += 1
                    break
                if dict1[i] % 3 == 1:
                    dict1[i] -= 2
                    count += 1
                else:
                    a = dict1[i] // 3
                    dict1[i] -= a*3
                    count += a
        return count

你可能感兴趣的:(LeetCode刷题,算法,leetcode,职场和发展,python,数据结构)