(新A卷,100分)- 运维日志排序(Java & JS & Python & C)华为OD

(新A卷,100分)- 运维日志排序(Java & JS & Python & C)华为OD

题目描述

运维工程师采集到某产品线网运行一天产生的日志n条,现需根据日志时间先后顺序对日志进行排序,日志时间格式为H:M:S.N。

  • H表示小时(0~23)
  • M表示分钟(0~59)
  • S表示秒(0~59)
  • N表示毫秒(0~999)

时间可能并没有补全,也就是说,01:01:01.001也可能表示为1:1:1.1。
 

输入描述

第一行输入一个整数n表示日志条数,1<=n<=100000,接下来n行输入n个时间。

输出描述

按时间升序排序之后的时间,如果有两个时间表示的时间相同,则保持输入顺序。

用例
输入

2
01:41:8.9
1:1:09.211

输出

1:1:09.211

01:41:8.9

说明
输入

3
23:41:08.023
1:1:09.211
08:01:22.0

输出

1:1:09.211

08:01:22.0

23:41:08.023

说明
输入

2
22:41:08.023
22:41:08.23

输出

22:41:08.023

22:41:08.23

说明两个时间表示的时间相同,保持输入顺序

题目解析

排序日志时间用到的知识是:

  • 将字符串时间中各要素提取出来(正则捕获组),然后计算出总毫秒数
  • 根据Array.prototype.sort自定义排序策略,来算出的总毫秒数进行排序

Java算法源码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int n = Integer.parseInt(br.readLine());

    String[] logs = new String[n];
    for (int i = 0; i < n; i++) logs[i] = br.readLine();

    Arrays.sort(logs, (a, b) -> Long.compare(convert(a), convert(b)));

    System.out.println(String.join("\n", logs));
  }

  public static long convert(String log) {
    String[] tmp = log.split("[:.]");
    long H = Long.parseLong(tmp[0]) * 60 * 60 * 1000;
    long M = Long.parseLong(tmp[1]) * 60 * 1000;
    long S = Long.parseLong(tmp[2]) * 1000;
    long N = Long.parseLong(tmp[3]);
    return H + M + S + N;
  }
}

JS算法源码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const n = parseInt(await readline());

  const logs = [];
  for (let i = 0; i < n; i++) {
    logs.push(await readline());
  }

  logs.sort((a, b) => convert(a) - convert(b));

  console.log(logs.join("\n"));
})();

function convert(log) {
  const [H, M, S, N] = log.split(/[:.]/);

  return (
    parseInt(H) * 60 * 60 * 1000 +
    parseInt(M) * 60 * 1000 +
    parseInt(S) * 1000 +
    parseInt(N)
  );
}

Python算法源码
# 输入获取
import re

n = int(input())
logs = [input() for _ in range(n)]


def convert(log):
    tmp = re.split(r"[:.]", log)

    H = int(tmp[0]) * 60 * 60 * 1000
    M = int(tmp[1]) * 60 * 1000
    S = int(tmp[2]) * 1000
    N = int(tmp[3])

    return H + M + S + N


# 算法入口
def getResult():
    logs.sort(key=convert)
    return "\n".join(logs)


# 算法调用
print(getResult())

C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp(const void *a, const void *b);
long convert(char *time);

// 依次是 小时转毫秒,分钟转毫秒,秒转毫秒, 毫秒转毫秒  的系数
int unit[] = {60 * 60 * 1000, 60 * 1000, 1000, 1};

int main() {
    // 日志条数
    int n;
    scanf("%d", &n);

    // 输入n个时间
    char **times = (char **) malloc(sizeof(char *) * n);
    for (int i = 0; i < n; i++) {
        times[i] = (char *) malloc(sizeof(char) * 15);
        scanf("%s", times[i]);
    }

    // 按时间升序排序, 如果有两个时间表示的时间相同,则保持输入顺序
    qsort(times, n, sizeof(char *), cmp);

    // 依次打印排序后时间
    for (int i = 0; i < n; i++) {
        printf("%s\n", times[i]);
    }

    return 0;
}

int cmp(const void *a, const void *b) {
    return convert(*(char **) a) - convert(*(char **) b);
}

// 时间字符串转毫秒数
long convert(char *time) {
    // strtok会改变被操作的字符串,因此这里要对输入字符串拷贝一下
    char tmp[20];
    strcpy(tmp, time);

    // 时间字符串对应的毫秒数
    long mills = 0;

    // unit的索引
    int i = 0;

    // 时间字符串按照 : 或 . 分割
    char *token = strtok(tmp, ":.");
    while (token != NULL) {
        mills += atol(token) * unit[i++];
        token = strtok(NULL, ":.");
    }

    return mills;
}
### 华为OD25模式及其职位含义 华为OD(Outsourcing Dispatcher)是一种特殊的用工形式,主要指通过第三方派遣的方式进入华为工作的员工。这种模式下的员工虽然名义上属于外包人员,但在实际工作中与正式员工并无明显区别[^2]。 #### **OD25的具体含义** OD25中的&ldquo;OD&rdquo;代表上述提到的派遣性质,&ldquo;25&rdquo;则是具体的项目编号或者业务类代号。具体来说,OD25可能对应于某些特定的技术领域或部门需求,例如IT行业的前端开发、后端开发、云计算工程师或其他专业技术岗位。这类职位通常需要应聘者具备一定的技术背景和经验,能够快速融入团队并承担相应的职责[^1]。 #### **华为OD模式的特点** - **招聘流程** 华为OD的招聘流程与其他正式员工相似,包括但不限于简历筛选、笔试(如算法或编程测试)、性格测评以及多轮面试(技术面试和技术主管面试)。这些环节旨在全面评估候选人的技术水平、沟通能力和文化适配度。 - **工作内容** OD员工的工作内容与正式员工基本一致,涉及技术研发、产品设计、运维支持等多个方向。对于IT行业而言,常见的OD职位包括软件开发工程师、数据析师、网络安全专家等。这些角色均需紧密配合华为的核心战略目标开展日常工作。 - **薪酬福利** 尽管OD员工的身份不同于正式编制,但其薪资水平由华为统一制定,并依据个人技术和贡献进行调整。&ldquo;同薪同酬&rdquo;的原则确保了OD员工享有较高的收入保障,在行业内具有较强的竞争力。此外,部城市的补贴政策也可能进一步提升整体待遇[^3]。 #### **职业发展路径** 在华为内部,无论是OD还是正式员工,均有平等的机会参与培训计划、晋升考核和发展规划。只要表现优异,OD员工同样可以成长为项目经理甚至更高层次的管理者。值得注意的是,优秀的OD员工还有机会转正成为正式成员之一。 --- ### 示例代码:假设某OD25职位为Python开发者,则以下是一个简单的函数实现案例 ```python def calculate_average(numbers): &quot;&quot;&quot; 计算列表中数值的平均数 :param numbers: 数字列表 :return: 平均值 &quot;&quot;&quot; if not numbers: return 0 total = sum(numbers) count = len(numbers) average = total / count return average data_points = [10, 20, 30, 40, 50] result = calculate_average(data_points) print(f&quot;The average is {result}&quot;) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值