世界已冷酷至极, 让我们携手前行。
自助收录

2023年华为OD机考真题:日志采集系统

算法刷题1年前 (2023)更新 江南白衣
570 0 0
2023年华为OD机考真题:日志采集系统

全网最全面的华为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);
    }
}
© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...