华为OD机试真题 JavaScript 实现【日志采集系统】【2023Q1 100分】

news/2024/7/2 23:38:26

在这里插入图片描述

一、题目描述

日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。

  • 如果上报太频繁,会对服务端造成压力;
  • 如果上报太晚,会降低用户的体验;
  • 如果一次上报的条数太多,会导致超时失败。

为此,项目组设计了如下的上报策略:

  1. 每成功上报一条日志,奖励1分
  2. 每条日志每延迟上报1秒,扣1分
  3. 积累日志达到100条,必须立即上报

给出日志序列,根据该规则,计算首次上报能获得的最多积分数。

二、输入描述

按时序产生的日志条数T1,T2…Tn,其中1 <= n <= 1000,0 <=Ti <= 100。

三、输出描述

首次上报最多能获得的积分数。3222

四、解题思路

  1. 读取输入的整数数组 arr;
  2. 初始化变量 count 和 max 为 0,用于记录累积日志条数和最大积分数;
  3. 遍历数组元素的下标 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,跳出循环;
  4. 输出最大积分数 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在线答疑。

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1241536.html

相关文章

线程池的主要处理流程及常用方法

线程池的主要处理流程及常用方法 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 一、主要处理流程&#xff1a; 当调用线程池execute() 方法添加一个任务时&#xff0c; threadPoolExecutor.execute&#xff0c;具体代码如下&#xff1a; p…

CVPR 2023 | 基于金字塔模型的异常检测方法

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2211.11317 0.背景&#xff1a; 工业异常检测旨在发现产品的异常区域&#xff0c;在工业质量检测中发挥着重要作用。在工业场景中&#xff0c;很容易获得大量的正…

力扣 1483. 树节点的第 K 个祖先

力扣 1483. 树节点的第 K 个祖先 题目地址&#xff1a;https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/ 暴力查找&#xff08;超时&#xff09;哈希查找&#xff08;超空间&#xff09;树上倍增 预处理 ancestor 数组记录了第 i 个 node 的倍增祖先&#xff0c…

Linux系统实现虚拟内存教程

Linux系统实现虚拟内存有两种方法&#xff1a;交换分区&#xff08;swap分区&#xff09;和交换文件&#xff0c; 一、交换文件 查看内存&#xff1a;free -m , -m是显示单位为MB&#xff0c;-g单位GB free -g 创建一个文件&#xff1a;touch命令用于修改…

Redis6之数据类型

常见数据类型 String字符串 简介 String是最基本的数据类型&#xff0c;是二进制安全的&#xff0c;一个key对应一个value 常用命令 1.set <key> <value> :添加键值对 2.get <key>&#xff1a;查询对应键值对 3.append <key> <value>&#xf…

微信小程序开发大坑盘点

微信小程序开发大坑盘点 起因 前几天心血来潮&#xff0c;想给学校设计个一站式校园小程序&#xff0c;可以查询成绩&#xff0c;考试信息&#xff0c;课表之类的&#xff08;本来想法里是还想包括一些社交功能的&#xff0c;但这个因为资质问题暂且搁置了&#xff09;。其实…

pandas---数据合并(concat、append、merge)

1. concat函数 pd.concat([data1, data2], axis1) 按照行或列进行合并&#xff0c;axis0为列索引&#xff0c;axis1为行索引。 df1 make_df([1, 2], [A, B]) df2 make_df([3, 4], [A, B]) display(df1, df2) # 默认上下合并&#xff0c;垂直合并 pd.concat([df1, df2]) …

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度&#xff0c;就会导致队列的消息堆积&#xff0c;知道队列存储消息达到上限。最早接受的消息&#xff0c;可能就会成为死信&#xff0c;会被丢弃&#xff0c;这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…