日常刷题(2)

1. 表达式括号匹配

1.1. 题目描述

(1+(2+3)*(3+(8+0))+1-2)这是一个简单的数学表达式,今天不是计算它的值,而是比较它的括号匹配是否正确。

前面这个式子可以简化为(()(()))这样的括号我们认为它是匹配正确的,

而((())这样的我们就说他是错误的。注意括号里面的表达式可能是错的,也可能有多个空格,对于这些我们是不用去管的,

我们只关心括号是否使用正确。

1.2. 输入描述

给出一行表达式(长度不超过 100)。

1.3. 输出描述

如果匹配正确输出括号的对数,否则输出-1。

1.4. 用例

输入 (1+(2+3)*(3+(8+0))+1-2)
输出 4

1.5. 代码

class MatchBrackets:
    def __call__(self, string: str):
        cnt = 0
        stack = []
        for c in string:
            if c not in '()':
                continue
            if c == '(':
                stack.append(c)

            if c == ')' and stack and stack[-1] == '(':
                stack.pop()
                cnt += 1
        if stack:
            return -1
        return cnt

2. 部门人力分配

2.1. 题目描述

部门在进行需求开发时需要进行人力安排。

当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。

这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。

目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。

请帮助部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?

2.2. 输入描述

输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,

1 ≤ N/2 ≤ M ≤ N ≤ 10000
1 ≤ requirements[i] ≤ 10^9

2.3. 输出描述

对于每一组测试数据,输出部门需要人力需求,行末无多余的空格

2.4. 用例

  • 输入
    3
    3 5 3 4
  • 输出 6
  • 说明
    输入数据两行,
    第一行输入数据3表示开发时间要求,
    第二行输入数据表示需求工作量大小,
    输出数据一行,表示部门人力需求。
    当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。
    当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。
    因此6是部门最小的人力需求。

2.5. 思路

和上一期吃桃子的思路类似,二分法找刚好能满足的资源。判断是否能满足也比较容易,尽可能一个月内完成两个任务,也就是把人多的项目和人少的项目同时开展即可(双指针)

2.6. 代码

class ResourcesAllocation:
    def can_finish(self, hc: int, task_list: List[int], time_limit: int) -> bool:
        l, r = 0, len(task_list) - 1

        cost = 0
        while l <= r:
            if task_list[l] + task_list[r] <= hc:
                l += 1
            r -= 1
            cost += 1
            if cost > time_limit:
                return False
        return cost <= time_limit

    def __call__(self, time_limit: int, task_list: List[int]):
        task_list.sort()

        min_hc, max_hc = 1, sum(task_list)
        ans = max_hc

        while min_hc < max_hc:
            mid_hc = (min_hc + max_hc) // 2
            if self.can_finish(mid_hc, task_list, time_limit):
                ans = mid_hc
                max_hc = mid_hc - 1
            else:
                min_hc = mid_hc + 1
        return ans

3. 测试用例执行计划

3.1. 题目描述

某个产品当前迭代周期内有 N 个特性(F1,F2,…FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其 ID 作为下标进行标识。

设计了 M 个测试用例(T1,T2,…,TM),每个测试用例对应一个覆盖特性的集合,测试用例使用其 ID 作为下标进行标识,测试用例的优先级定义为其覆盖的特性的优先级之和。

在开展测试之前,需要制定测试用例的执行顺序,规则为:优先级大的用例先执行,如果存在优先级相同的用例,用例 ID 小的先执行。

输入描述
第一行输入为 N 和 M,

N 表示特性的数量,0 < N ≤ 100
M 表示测试用例的数量,0 < M ≤ 100
之后 N 行表示特性 ID=1 到特性 ID=N 的优先级,

再接下来 M 行表示测试用例 ID=1 到测试用例 ID=M 关联的特性的 ID 的列表。

3.2. 输出描述

按照执行顺序(优先级从大到小)输出测试用例的 ID,每行一个ID。

测试用例覆盖的 ID 不重复。

3.3. 用例

3.3.1. case1

  • 输入
    5 4
    1
    1
    2
    3
    5
    1 2 3
    1 4
    3 4 5
    2 3 4
  • 输出
    3
    4
    1
    2
  • 说明
    测试用例的优先级计算如下:
    T1 = Pf1 + Pf2 + Pf3 = 1 + 1 + 2 = 4
    T2 = Pf1 + Pf4 = 1 + 3 = 4
    T3 = Pf3 + Pf4 + Pf5 = 2 + 3 + 5 = 10
    T4 = Pf2 + Pf3 + Pf4 = 1 + 2 + 3 = 6
    按照优先级从小到大,以及相同优先级,ID小的先执行的规则,执行顺序为T3,T4,T1,T2

3.4. 题目解析

题目没看懂,但是用例凑出来了规律,大概就是一个分值表,一个array,array里的分值越大排序越靠前。那sort就完事了

3.5. 代码

class Solution:
    def __call__(self, features: List[int], prior: List[List[int]]):
        prior_sum = []
        for i, _prior in enumerate(prior, start=1):
            _prior_sum = sum(map(lambda x: features[x-1], _prior))
            prior_sum.append((_prior_sum, -i, i))

        prior_sum.sort(reverse=True)
        return list(map(lambda x: x[-1], prior_sum))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值