华为OD技术C卷“测试用例执行计划”Java解答

描述

示例

算法思路1

整体思路是,先读取特性的优先级和测试用例覆盖的特性列表,然后计算每个测试用例的优先级,并将其与测试用例的索引存储到二维数组中。最后按照优先级和索引排序,输出测试用例的索引,即为执行顺序。 

  1. 首先从标准输入中读取了两个整数 nm,分别表示特性的数量和测试用例的数量。

  2. 创建了一个长度为 n 的数组 priorities,用于存储特性的优先级。

  3. 使用循环读取每个特性的优先级,并将其存储到 priorities 数组中。

  4. 通过 in.nextLine() 读取了一个空行,用于消耗掉换行符。

  5. 创建了一个二维数组 res,其行数为测试用例的数量 m,列数为2,用于存储测试用例的优先级和对应的索引。

  6. 使用循环遍历每个测试用例:

    • 使用 in.nextLine() 读取了一行输入,其中包含了一个测试用例覆盖的特性列表。
    • 使用 split(" ") 方法将输入拆分为特性的索引数组。
    • 使用流式处理将特性的索引转换为整数流,并对每个特性索引计算其对应特性的优先级,并将所有特性的优先级求和。
    • 将求和得到的优先级和当前测试用例的索引存储到 res 数组中。
  7. 使用 Arrays.sort()res 数组进行排序,排序规则为:

    • 首先按照测试用例的优先级从大到小排序。
    • 如果测试用例的优先级相同,则按照测试用例的索引从小到大排序。
  8. 使用循环遍历排序后的 res 数组,并输出测试用例的索引(ID),注意索引从0开始,需要加1。

答案1

import java.util.Arrays;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别int n = in.nextInt();int m = in.nextInt();int[] priorities = new int[n];for (int i = 0; i < n; i++) {priorities[i] = in.nextInt();}in.nextLine();int[][] res = new int[m][2];for (int i = 0; i < m; i++) {int sum = Arrays.stream(in.nextLine().split(" ")).mapToInt(a -> {int idx = Integer.parseInt(a);return priorities[idx - 1];}).sum();res[i][0] = sum;res[i][1] = i;}Arrays.sort(res, (a,b) -> {return b[0]-a[0] == 0 ? a[1] - b[1] : b[0]-a[0];});for (int[] re : res) {System.out.println(re[1]+1);}}
}

详解1

int sum = Arrays.stream(in.nextLine().split(" ")).mapToInt(a -> { int idx = Integer.parseInt(a); return priorities[idx - 1]; }).sum(); 

  1. in.nextLine() 用来读取一行输入。这行输入是一系列用空格分隔的整数,表示任务的优先级索引。

  2. .split(" ") 将读取到的一行输入按照空格进行分割,将每个优先级索引分开,形成一个字符串数组。

  3. Arrays.stream() 将得到的字符串数组转换为一个流(Stream),这样我们就可以对每个优先级索引进行操作。

  4. .mapToInt(a -> {...}) 这是一个映射操作,对流中的每个元素进行处理。对于每个优先级索引 a,执行一系列操作:

    a. int idx = Integer.parseInt(a); 将字符串表示的优先级索引转换为整数。

    b. priorities[idx - 1] 通过索引找到对应的优先级,并返回。

  5. .sum() 对映射后的优先级数组求和,得到该任务的总优先级。

整体来说,这段代码的作用是将每个任务的优先级索引转换为对应的优先级,然后计算总优先级,最后将这些总优先级存储在 sum 变量中。 

Arrays.sort(res, (a,b) -> {
    return b[0]-a[0] == 0 ? a[1] - b[1] : b[0]-a[0];
}); 

这段代码使用了一个 lambda 表达式作为比较器,用于比较二维数组 res 中的元素。Lambda 表达式的参数是 (a, b),其中 abres 中的每个元素,类型为 int[]。Lambda 表达式的主体根据总优先级和任务索引的比较结果返回一个整数值,用于指示元素的相对顺序。

Lambda 表达式中的逻辑解释如下:

  • b[0]-a[0] == 0:首先,按照元素的第一个值(即总优先级)进行比较。如果两个元素的总优先级相等,则进入三元条件运算符的条件部分。

  • a[1] - b[1]:如果两个元素的总优先级相等,则按照元素的第二个值(即任务索引)进行比较。这部分逻辑会在总优先级相等时生效,以确保相同优先级的任务按照索引升序排列。

  • b[0]-a[0]:如果两个元素的总优先级不相等,则直接根据总优先级的差值返回比较结果,以便在排序时按照总优先级降序排列。

Lambda表达式应用 

Lambda表达式是Java编程语言中引入的一种函数式编程特性。它提供了一种简洁的语法来创建匿名函数,从而更轻松地实现函数式编程风格的代码。Lambda表达式通常用于替代匿名内部类的简单情况,使代码更加简洁和易读。

Lambda表达式的一般语法如下:

(parameters) -> expression

或者

(parameters) -> { statements; }

Lambda表达式由几个部分组成:

  1. 参数列表:表示Lambda表达式接受的参数。如果没有参数,可以留空或使用一对空括号 ()
  2. 箭头 ->:将参数列表和Lambda表达式的主体分隔开来。
  3. 主体:可以是一个表达式,也可以是一段代码块。如果是一个表达式,它的结果将作为Lambda表达式的返回值。如果是一段代码块,则需要使用大括号 {} 将代码块括起来,并且需要使用 return 关键字来返回值。

Lambda表达式的特点包括:

  • 简洁性:Lambda表达式使用了一种简洁的语法,可以使代码更加简洁、易读。
  • 匿名性:Lambda表达式可以创建匿名函数,无需显式地命名函数。
  • 类型推断:Java编译器可以推断Lambda表达式的参数类型,使得Lambda表达式的使用更加方便。
  • 语法灵活性:Lambda表达式可以用于函数式接口,使得在需要函数式接口的地方可以使用Lambda表达式代替传统的匿名内部类。

Lambda表达式详见Lambda表达式-CSDN博客

Stream流待更新……

算法思路2

  1. 读取输入并保存数据结构:

    • 读取特性的数量 N 和测试用例的数量 M。
    • 创建一个长度为 N 的数组,用于存储特性的优先级。
    • 创建一个长度为 M 的列表,其中每个元素是一个集合,表示每个测试用例覆盖的特性。
  2. 计算测试用例的优先级:

    • 遍历测试用例列表,对于每个测试用例,遍历其覆盖的特性集合,累加特性的优先级,得到测试用例的优先级。
  3. 按照规则排序测试用例:

    • 对测试用例列表进行排序,首先按照优先级从大到小排序,如果优先级相同,则按照测试用例的ID从小到大排序。
  4. 输出测试用例的执行顺序:

    • 按照排序后的顺序输出测试用例的ID。

答案2

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = scanner.nextInt(); // 特性的数量int M = scanner.nextInt(); // 测试用例的数量int[] priorities = new int[N + 1]; // 特性的优先级,索引从1开始for (int i = 1; i <= N; i++) {priorities[i] = scanner.nextInt();}scanner.nextLine(); // 消耗换行符List<TestCase> testCases = new ArrayList<>();for (int i = 1; i <= M; i++) {int priority = 0;String[] features = scanner.nextLine().split(" ");for (String feature : features) {int featureId = Integer.parseInt(feature);priority += priorities[featureId];}testCases.add(new TestCase(i, priority));}// 按照优先级从大到小排序,如果优先级相同则按照ID从小到大排序testCases.sort((a, b) -> a.priority != b.priority ? Integer.compare(b.priority, a.priority) : Integer.compare(a.id, b.id));// 输出测试用例的执行顺序for (TestCase testCase : testCases) {System.out.println(testCase.id);}scanner.close();}static class TestCase {int id; // 测试用例的IDint priority; // 测试用例的优先级public TestCase(int id, int priority) {this.id = id;this.priority = priority;}}
}

详解2

list列表接口的使用详见Java“集合框架”知识速成笔记学完就去实战(三)-CSDN博客文章浏览阅读1.1k次,点赞32次,收藏12次。吐血整理!本文为Java中集合类型的一些常见接口和实现类,包括List接口,Set接口和Map接口,重点介绍了HashSet实现类。https://blog.csdn.net/wwwwwmmn/article/details/136433958 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539319.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么避免电脑数据被拷贝?电脑如何禁用USB功能?

在无纸化办公的今天&#xff0c;很多重要数据都存放在电脑中。为了避免数据泄露&#xff0c;需要采用安全的方式保护电脑数据。那么&#xff0c;该如何避免电脑数据被拷贝呢&#xff1f;下面我们就来了解一下。 方法一&#xff1a;物理隔绝 物理隔绝是一种原始但有效的USB禁用…

C++初阶 | [九] list 及 其模拟实现

摘要&#xff1a;介绍 list 容器&#xff0c;list 模拟实现 list&#xff08;带头双向循环列表&#xff09; 导入&#xff1a;list 的成员函数基本上与 vector 类似&#xff0c;具体内容可以查看相关文档(cplusplus.com/reference/list/list/)&#xff0c;这里不多赘述。以下对…

leetcode 热题 100_两两交换链表中的节点

题解一&#xff1a; 迭代&#xff1a;设置节点指针存储结果&#xff0c;遍历链表&#xff0c;直接修改节点的指向。 class Solution {public ListNode swapPairs(ListNode head) {ListNode result new ListNode();result.next head;ListNode temp result;while (temp.next …

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/

基于单片机的家庭防盗报警系统

摘 要 随着社会的发展&#xff0c;人们生活水平的不断提高和家居用品的高档化&#xff0c;家庭安全隐患也随之增加&#xff0c;所以人们便进一步提高了对家庭的保护意识。因此&#xff0c;这就不得不促使安全防盗报警系统的普及与推广。 然而传统的防盗措施难以实现人们的需求…

网络基础 - 预备知识(协议、网络协议、网络传输流程、地址管理)

文章目录 1. 认识 协议2. 了解 网络协议2.1 引入 协议分层2.2 OSI 七层模型 与 TCP/IP 四层模型 3. 网络传输 流程&#xff01;&#xff01;&#xff01;3.1 网络传输流程图3.2 关于报头3.3 实例解释 传输过程&#xff08;封装与解包&#xff09; 4. 网络中的地址管理4.1 认识 …

EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

EMQX 5.0水平扩展能力得到了指数级提升&#xff0c;能够更可靠地承载更大规模的物联网设备连接量。 在EMQX5.0正式发布前的性能测试中&#xff0c;我们通过一个23节点的EMQX集群&#xff0c;全球首个达成了1亿MQTT连接每秒100万消息吞吐&#xff0c;这也使得EMQX 5.0成为目前为…

如何利用百度SEO优化技巧将排到首页

拥有一个成功的网站对于企业和个人来说是至关重要的&#xff0c;在当今数字化的时代。在互联网上获得高流量和优质的访问者可能并不是一件容易的事情&#xff0c;然而。一个成功的SEO战略可以帮助你实现这一目标。需要一些特定的技巧和策略、但要在百度搜索引擎中获得较高排名。…

基于YOLOv8深度学习的脑肿瘤智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、智慧医疗

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

rust学习(简单链表)

编写一个简单链表&#xff0c;主要遇到的问题就是next指针&#xff08;按照C的写法&#xff09;的数据如何定义。按照网上的建议&#xff0c;一般定义如下&#xff1a; struct Node {pub value:u32,pub next:Option<Rc<RefCell<Node>>>, //1 }1.用Option主要…

Flink通讯模型—Akka与Actor模型

Carl Hewitt 在1973年对Actor模型进行了如下定义&#xff1a;"Actor模型是一个把Actor作为并发计算的通用原语". Actor是异步驱动&#xff0c;可以并行和分布式部署及运行的最小颗粒。也就是说&#xff0c;它可以被分配&#xff0c;分布&#xff0c;调度到不同的CPU&…

.Net使用ElasticSearch

文章目录 前言主体内容一.Kibana中ElasticSearch的基础操作1.GET&#xff08;查询&#xff09;1.POST&#xff08;新增&#xff09;1.PUT&#xff08;修改&#xff09;1.DELET&#xff08;删除&#xff09; 二.在.Net中&#xff0c;对ElasticSearch进行基础操作1.DotNet连接Ela…