华为OD刷题C卷 - 每日刷题 19(查找接口成功率最优时间段、最大N个数与最小N个数的和)

本文主要是介绍华为OD刷题C卷 - 每日刷题 19(查找接口成功率最优时间段、最大N个数与最小N个数的和),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、(查找接口成功率最优时间段):

这段代码是解决“查找接口成功率最优时间段”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个辅助方法getSum,用于找出数组中最长的时间段,该时间段内的平均失败率小于等于给定的容忍值minAverageLost

main方法首先读取失败率容忍值minAverageLost和失败率数组arr,然后调用getResult方法并打印满足条件的最长时间段的下标对。

getResult方法使用双层循环遍历数组arr的所有可能子区间,通过getSum方法计算每个子区间的和,然后根据和与容忍值minAverageLost的关系来判断该子区间是否满足条件。如果满足条件,就更新最长时间段的记录,并存储下标对。最后,将所有满足条件的最长时间段的下标对按从小到大排序并返回。

getSum方法用于计算数组arr从索引startend的元素之和。

2、(最大N个数与最小N个数的和):

这段代码是解决“最大N个数与最小N个数的和”的问题。它提供了一个Java类Main,其中包含main方法和getSum方法,用于计算数组中最大N个数与最小N个数的和,同时需要对数组进行去重。

main方法首先读取数组的大小M和数组内容,然后读取需要计算的个数N,接着调用getSum方法并打印结果。

getSum方法首先检查输入的合法性,包括数组是否为空、数字是否在指定范围内。然后,使用HashSet对数组进行去重,并检查去重后的集合大小是否小于2 * N,如果是,则返回-1表示输入非法。接着,将去重后的集合转换为列表并排序。最后,使用双指针技术计算最大N个数与最小N个数的和。

package OD282;import java.util.*;/*** @description 查找接口成功率最优时间段* @level 6* @score 100*//*** 题目描述* 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,* <p>* 数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,* <p>* 给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost,* <p>* 找出数组中最长时间段,如果未找到则直接返回NULL。* <p>* 输入描述* 输入有两行内容,第一行为{minAverageLost},第二行为{数组},数组元素通过空格(” “)分隔,* <p>* minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个。* <p>* 输出描述* 找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始),* <p>* 如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(” “)拼接,多个下标对按下标从小到大排序。*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//minAverageLostint minAverageLost = Integer.parseInt(sc.nextLine());int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();System.out.println(getResult(arr, minAverageLost));}//找出平均值小于等于n的最长时间段,输出对应下标 如0-1 3-4 多个下标对按从小到大排序public static String getResult(int[] arr, int minAverageLost) {//存放最长时间段 可以有多个List<int[]> list = new ArrayList<>();//初始化最大长度int maxLen = 0;for (int i = 0; i < arr.length; i++) {for (int j = i; j < arr.length; j++) {//区间[i,j]的和int sum = getSum(arr, i, j);int len = j - i + 1;int lost = len * minAverageLost;if (sum <= lost) {//如果len>maxLen 则清空list,并添加最新的,重置maxLen//如果len=maxLen,则直接添加进listif (len >= maxLen) {if (len > maxLen) {//清空之前maxLen长度的listlist.clear();}//然后再添加list.add(new int[]{i, j});maxLen = len;}}}}//未找到则返回NULLif (list.isEmpty()) {return "NULL";}//按开始下标升序排序list.sort(Comparator.comparingInt(a -> a[0]));//添加进结果StringJoiner sj = new StringJoiner(" ");list.forEach(t -> sj.add(t[0] + "-" + t[1]));//for (int[] temp : list) {//    sj.add(temp[0] + "-" + temp[1]);//}return sj.toString();}//从数组中start加到end位置的和public static int getSum(int[] arr, int start, int end) {int sum = 0;for (int i = start; i <= end; i++) {sum += arr[i];}return sum;}
}
package OD283;import java.util.*;/*** @description 最大N个数与最小N个数的和* @level 6*//*** 题目描述* 给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。* <p>* 说明:* <p>* 数组中数字范围[0, 1000]* 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1* 输入非法返回-1* 输入描述* 第一行输入M, M标识数组大小* 第二行输入M个数,标识数组内容* 第三行输入N,N表达需要计算的最大、最小N个数* 输出描述* 输出最大N个数与最小N个数的和*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//数字个数int m = Integer.parseInt(sc.nextLine());int[] arr = new int[m];for (int i = 0; i < m; i++) {arr[i] = sc.nextInt();}//最大最小个数int n = sc.nextInt();System.out.println(getSum(arr, n));}//返回数组中最大最小n个数的和,有重叠返回-1public static int getSum(int[] arr, int n) {if (arr == null || arr.length == 0 || n <= 0) {return -1;}//数字范围为0-1000Set<Integer> set = new HashSet<>();for (int num : arr) {if (num < 0 || num > 1000) {return -1;}set.add(num);}//去重后如果set的大小小于2n,则一定会重叠if (set.size() < 2 * n) {return -1;}//排序set中的数List<Integer> list = new ArrayList<>(set);Collections.sort(list);//最大最小n个数的和int ans = 0;//左指针int l = 0;//右指针int r = list.size() - 1;while (n > 0) {ans += list.get(l) + list.get(r);l++;r--;n--;}return ans;}
}

这篇关于华为OD刷题C卷 - 每日刷题 19(查找接口成功率最优时间段、最大N个数与最小N个数的和)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045558

相关文章

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及