全网最全面的华为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);
}
}
