前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
日志采集是运维系统的核心组件,日志是按行生成,每行记做一条,由采集系统分批上报。
上报策略的设计需要平衡多个因素:上报频率、服务端压力、用户体验以及避免超时失败。
根据题目描述,项目组设计了以下上报策略:
- 奖励机制:每成功上报一条日志,奖励1分。
- 扣分机制:每条日志每延迟上报1秒,扣1分。
- 强制上报条件:积累日志达到100条时,必须立即上报。
给出日志序列,根据该规则,计算首次上报能获得的最多积分数。
输入
按时序产生的日志条数 T1,T2...Tn, 其中 1≤n≤1000,0≤Ti≤100
输出
首次上报最多能获得的积分数
示例
输入:
1 98 1
输出:98
解题思路
- 按上报策略计算产生即上报、逐次拖延、直到必须强制上报的得分数
- 取得分中的最大值
题解
java实现
package huawei.e100;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月9日
*
*/
public class T07 {
private static int pull(String[] logNums) {
int score = 0;
int sum = 0;
int maxScore = 0;
for (int i = 0; i< logNums.length; i++) {
int num = Integer.parseInt(logNums[i]);
score = (score + num - sum) > 0 ? (score + num - sum) : 0;
sum += num;
maxScore = Math.max(maxScore, score);
if (sum >= 100) {
return maxScore;
}
// 附加策略, 当分值被扣完后必须上报
if (score == 0 && sum > 0) { return 0;}
}
return maxScore;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String input = sc.nextLine();
String[] logNums = input.split(" ");
int score = pull(logNums);
System.out.println(score);
}
}
}