
华为OD机试 2024C卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
某个产品当前迭代周期内有N个特性(F1, F2, …, FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。
设计了M个测试用例(T1, T2,…,TM),每个用例对应了一个覆盖特性的集合,测试用例使用其ID作为下标进行标识,测试用例的优先级定义为其覆盖的特性的优先级之和。
在开展测试之前,需要制定测试用例的执行顺序,规则为:优先级大的用例先执行,如果存在优先级相同的用例,用例ID小的先执行。
二、输入描述
第一行输入为N和M,N表示特性的数量,M表示测试用例的数量。
之后N行表示特性ID=1到特性ID=N的优先级。
再接下来M行表示测试用例ID=1到测试用例ID=M关联的特性的ID的列表。
三、输出描述
按照执行顺序(优先级从大到小)输出测试用例的ID,每行一个ID。
1、输入
5 4
 1
 1
 2
 3
 5
 1 2 3
 1 4
 3 4 5
 2 3 4
2、输出
3
 4
 1
 2
3、说明
四、解题思路
1、读取输入数据:
首先获取特性的数量 N 和测试用例的数量 M。
 接着读取 N 个整数,分别代表每个特性的优先级,存储在数组 featurePriorities 中。
 然后读取 M 行数据,每行描述一个测试用例覆盖的特性 ID 列表,存储在列表中。
2、计算测试用例优先级:
对于每个测试用例,根据其覆盖的特性 ID 列表,计算总的优先级。总优先级是该测试用例覆盖的所有特性的优先级之和。
 使用数组或集合来存储每个测试用例的优先级和其 ID。
3、排序和输出:
对测试用例按照优先级降序进行排序,若优先级相同,则按照 ID 升序排序。
 输出排序后的测试用例 ID。
五、Java算法源码
public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt(); // 读取特性的数量
        int M = scanner.nextInt(); // 读取测试用例的数量
        int[] featurePriorities = new int[N + 1]; // 特性优先级数组,下标从1开始
        for (int i = 1; i <= N; i++) {
            featurePriorities[i] = scanner.nextInt(); // 读取每个特性的优先级
        }
        List<TestCase> testCases = new ArrayList<>();
        scanner.nextLine(); // 移动到下一行开始读取用例数据
        for (int i = 1; i <= M; i++) {
            String line = scanner.nextLine();
            String[] features = line.split(" ");
            int prioritySum = 0;
            for (String feature : features) {
                int featureId = Integer.parseInt(feature);
                prioritySum += featurePriorities[featureId]; // 计算当前测试用例的总优先级
            }
            testCases.add(new TestCase(i, prioritySum)); // 存储测试用例ID和其优先级
        }
        // 根据优先级降序,ID升序排序
        Collections.sort(testCases, (a, b) -> {
            if (b.priority != a.priority) {
                return b.priority - a.priority; // 优先级高的先
            } else {
                return a.id - b.id; // ID小的先
            }
        });
        // 输出结果
        for (TestCase tc : testCases) {
            System.out.println(tc.id);
        }
        scanner.close();
    }
    // 定义测试用例类
    static class TestCase {
        int id;
        int priority;
        TestCase(int id, int priority) {
            this.id = id;
            this.priority = priority;
        }
    }
}
 
六、效果展示
1、输入
3 3
 3
 1
 5
 1 2 3
 1 2 3
 1 2 3
2、输出
1
 2
 3
3、说明

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。












![正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.1,2,3-GPIO中断控制实验](https://img-blog.csdnimg.cn/direct/0104022c590b473693481f0fa715879a.png)


![[图解]实现领域驱动设计译文暴露的问题04](https://img-blog.csdnimg.cn/direct/5b1a9564908f4267a25284033e14cd68.png)



