一、题目描述
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
- 如果上报太频繁,会对服务端造成压力;
- 如果上报太晚,会降低用户的体验;
- 如果一次上报的条数太多,会导致超时失败。
为此,项目组设计了如下的上报策略:
- 每成功上报一条日志,奖励1分
- 每条日志每延迟上报1秒,扣1分
- 积累日志达到100条,必须立即上报
给出日志序列,根据该规则,计算首次上报能获得的最多积分数。
二、输入描述
按时序产生的日志条数T1,T2…Tn,其中1 <= n <= 1000,0 <=Ti <= 100。
三、输出描述
首次上报最多能获得的积分数。3222
四、解题思路
- 读取输入的整数数组 arr;
- 初始化变量 count 和 max 为 0,用于记录累积日志条数和最大积分数;
- 遍历数组元素的下标 i,从 0 到 arr.length-1;
- 将当前元素的值转换为整数 num;
- 如果 num 为 0,跳过当前循环;
- 累加 num 到变量 count,表示累积日志条数;
- 初始化变量 score 为 0,用于计算当前上报情况下的积分数;
- 对于下标从 0 到 i 的元素,进行以下操作:
- 如果累积日志条数超过 100,并且当前下标 i 与循环下标 j 相等,表示必须立即上报,计算 score 为 num 减去超过 100 的部分;
- 否则,计算 score 为当前元素的值减去延迟上报的时间;
- 如果 score 大于 max,更新 max 的值为 score;
- 如果累积日志条数达到或超过 100,跳出循环;
- 输出最大积分数 max;
五、JavaScript算法源码
function calculate(logs) {
const arr = logs.split(" ");
let count = 0;
let max = 0;
for (let i = 0; i < arr.length; i++) {
const num = parseInt(arr[i]);
if (num === 0) {
continue;
}
count += num;
let score = 0;
for (let j = 0; j <= i; j++) {
// 如果累积日志条数超过 100,并且当前下标 i 与循环下标 j 相等,表示必须立即上报,计算 score 为 num 减去超过 100 的部分;
if (count > 100 && i === j) {
score += num - (count - 100);
} else {
// 计算 score 为当前元素的值减去延迟上报的时间
score += parseInt(arr[j]) - (i - j) * parseInt(arr[j]);
}
}
// 如果 score 大于 max,更新 max 的值为 score
if (score > max) {
max = score;
}
// 如果累积日志条数达到或超过 100,跳出循环
if (count >= 100) {
break;
}
}
return max;
}
感谢刷题群小伙伴提供的简化算法。
function calculateMaxScore(logs) {
const arr = logs.split(" ");
let count = 0;
let max = 0;
for (let i = 0; i < arr.length; i++) {
const num = parseInt(arr[i]);
count += num;
let score = 0;
if (num !== 0) {
for (let j = 0; j <= i; j++) {
score += parseInt(arr[j]) - (i - j) * parseInt(arr[j]);
}
if (count > 100 && i === arr.length - 1) {
score += num - (count - 100);
}
}
max = Math.max(max, score);
if (count >= 100) {
break;
}
}
return max;
}
六、效果展示
1、输入
2 95 3
2、输出
95
3、说明
如果第2个时刻上报,可获得最大积分(2 + 95)- 2 * 1 = 95。
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。