全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:日志采集系统
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。
为此,项目组设计了如下的上报策略:
1、每成功上报一条日志,奖励1分
2、每条日志每延迟上报1秒,扣1分
3、积累日志达到100条,必须立即上报
给出日志序列,根据该规则,计算首次上报能获得的最多积分数
输入描述:
按时序产生的日志条数 T1,T2…Tn, 其中 1<=n<=1000, 0<=Ti<=100
输出描述:
首次上报最多能获得的积分数
示例1
输入:
1 98 1
输出:
98
说明:
采集系统第2个时刻上报,可获得最大积分(98+1)-1=98
示例2
输入:
50 60 1
输出:
50
说明:
如果第1个时刻上报,获得积分50。如果第2个时刻上报,最多上报100条,前50条延迟上报1s,每条扣除1分,共获得积分为 100-50=50
解题思路:
需要对第一个采集日志进行判断,大于等于100直接输出100
将所有的采集日志转换成数组进行遍历。计算当前的日志总数和日志积分
例:1 2 97
Index=1:积分就是1
Index=2:日志总数1+2=3,积分3 – 1*1(第一采集的延时了1秒)
Index=3:日志总数1+2+97=100,积分100 – 21(第二个采集的延时了1秒) – 12(第一个采集的延时了2秒) = 96
代码实现一:
package com.codernav.demo.hwod.exam; import java.util.Scanner; /** * @title 日志采集系统 * @Description 一日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 * 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。 * 为此,项目组设计了如下的上报策略: * 1、每成功上报一条日志,奖励1分 * 2、每条日志每延迟上报1秒,扣1分 * 3、积累日志达到100条,必须立即上报 * 给出日志序列,根据该规则,计算首次上报能获得的最多积分数 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/13 */ public class Main { public static int[] ints; public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] strs = sc.nextLine().split(" "); ints = new int[strs.length]; for (int i = 0; i < strs.length; i++) { ints[i] = Integer.parseInt(strs[i]); } int count = ints[0]; //日志总数 int max = ints[0]; //最大积分 if (ints[0] >= 100) { System.out.println(100); } else { for (int i = 1; i < strs.length; i++) { int log = Integer.parseInt(strs[i]); //当前日志数 count += log; //需要计算日志总数 if (count >= 100) { max = Math.max(max, 100 - jisuan(i)); break; } else { max = Math.max(max, count - jisuan(i)); } } System.out.println(max); } } /** * 求index前日志扣的分数 * * @param index 当前日志索引 * @return 需要扣除的分数 */ public static int jisuan(int index) { int core = 0; for (int i = 0; i < index; i++) { core += ints[i] * (index - i); } return core; } }
代码实现二:
package com.codernav.demo.hwod.exam; import java.util.Scanner; /** * @title 日志采集系统 * @Description 一日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。 * 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。 * 为此,项目组设计了如下的上报策略: * 1、每成功上报一条日志,奖励1分 * 2、每条日志每延迟上报1秒,扣1分 * 3、积累日志达到100条,必须立即上报 * 给出日志序列,根据该规则,计算首次上报能获得的最多积分数 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/13 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int[] arr = new int[1000]; int n = 0; while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例 arr[n++] = in.nextInt(); } int[] arr1 = new int[n]; System.arraycopy(arr, 0, arr1, 0, n); int max = 0; int[] ans = new int[n + 1]; for (int i = 0; i < n; i++) { ans[i + 1] = ans[i] + arr1[i]; int t = 0; for (int j = i; j >= 1; j--) { t += ans[j]; } if (ans[i + 1] >= 100) { max = Math.max(max, 100 - t); break; } else { max = Math.max(max, ans[i + 1] - t); } } System.out.println(max); } }