当前位置: 首页 > news >正文

【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录

题目描述

考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。

如果出现以下两种情况,则认为打卡异常:

  1. 实际设备号与注册设备号不一样;
  2. 同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。

给定打卡记录的字符串数组clockRecords(每个打卡记录组成为:工号、时间(分钟)、打卡距离(km)、实际设备号、注册设备号),返回其中异常的打卡记录(按输入顺序输出)。

输入描述

第一行输入为N,表示打卡记录数;之后的N行表示打卡记录,每一行表示一条打卡记录。

例如:

2
100000,10,1,ABCD,ABCD
100000,50,10,ABCD,ABCD

输出描述

输出为异常的打卡记录,例如:

100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD

备注

  1. clockRecords长度 <= 1000
  2. clockRecords[i]格式:{id},{time},{distance},{actualDeviceNumber},{registeredDeviceNumber}
  3. id由6位数字组成
  4. time由整数组成,范围为0~1000
  5. distance由整数组成,范围为0~100
  6. actualDeviceNumberregisteredDeviceNumber由4位大写字母组成

示例描述

示例一

输入:

2
100000,10,1,ABCD,ABCD
100000,50,10,ABCD,ABCD

输出:

100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD

说明:
第一条记录是异常的,因为第二条记录与它的间隔不超过60分钟,但是打卡距离超过了5km,同理第二条记录也是异常的。

示例二

输入:

2
100000,10,1,ABCD,ABCD
100000,80,10,ABCE,ABCD

输出:

100000,80,10,ABCE,ABCD

说明:
第二条记录的注册设备号与打卡设备号不一致,所以是异常记录。

示例三

输入:

2
100000,10,1,ABCD,ABCD
100000,80,10,ABCE,ABCE

输出:

null

说明:
无异常打卡记录,所以返回null

解题思路

  1. 用对象EmployeeRecord存储打卡记录,并先判断实际设备号与注册设备号是否一致。
  2. 将打卡记录存储在对象列表中
  3. 遍历打卡记录的列表:
    • 计算打卡时间
    • 计算打卡距离
    • 如果两个打卡记录时间小于60,并且打卡距离超过5km,打卡异常,设置vaildFalse
  4. 得到打卡异常的记录并返回字符串。

解题代码

def solve_method(clock_records):
    employee_records = []
    for record in clock_records:
        employee_record = EmployeeRecord(record[0], record[1], record[2], record[3], record[4])
        employee_record.set_vaild(employee_record.check_device_number())
        employee_records.append(employee_record)

    for i in range(len(employee_records)):
        for j in range(i + 1, len(employee_records)):
            if employee_records[i].id == employee_records[j].id:
                # 计算打卡时间
                time_diff = abs(employee_records[i].time - employee_records[j].time)
                # 计算打卡距离
                distance_diff = abs(employee_records[i].distance - employee_records[j].distance)
                # 如果两个打卡记录时间小于60,并且打卡距离超过5km,打卡异常
                if time_diff < 60 and distance_diff > 5:
                    employee_records[i].vaild = False
                    employee_records[j].vaild = False

    # 得到打卡异常的记录
    result = ";".join(str(record) for record in employee_records if not record.vaild)
    return "null" if len(result) == 0 else result


class EmployeeRecord:
    def __init__(self, id, time, distance, actual_device_number, registered_device_number):
        self.id = id
        self.time = time
        self.distance = distance
        self.actual_device_number = actual_device_number
        self.registered_device_number = registered_device_number
        # 打卡是否合法
        self.vaild = True

    def set_vaild(self, vaild):
        self.vaild = vaild

    def __str__(self):
        return f"{self.id},{self.time},{self.distance},{self.actual_device_number},{self.registered_device_number}"

    def check_device_number(self):
        # 实际设备号与注册设备号不一致,打卡异常
        if self.actual_device_number == self.registered_device_number:
            return True
        return False



if __name__ == '__main__':
    clockRecords = [
        ["100000", 10, 1, "ABCD", "ABCD"],
        ["100000", 50, 10, "ABCD", "ABCD"]
    ]
    assert solve_method(clockRecords) == "100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD"

    clockRecords = [
        ["100000", 10, 1, "ABCD", "ABCD"],
        ["100000", 80, 10, "ABCE", "ABCD"]
    ]
    assert solve_method(clockRecords) == "100000,80,10,ABCE,ABCD"

    clockRecords = [
        ["100000", 10, 1, "ABCD", "ABCD"],
        ["100000", 80, 10, "ABCE", "ABCE"]
    ]
    assert solve_method(clockRecords) == "null"

在这里插入图片描述

相关文章:

  • Zookeeper 的核心引擎:深入解析 ZAB 协议
  • C#-委托
  • Redis7——进阶篇(一)
  • 正浩创新内推:校招、社招EcoFlow社招内推码: FRQU1CY
  • 鸿蒙应用开发入门教程
  • Spring学习——新建module模块
  • 无法创建虚拟机问题
  • Blender调整最佳渲染清晰度
  • wordpress子分类调用父分类名称和链接的3种方法
  • 数字人口播:开启内容创作新时代,实时对话数字人源码环境,可OEM
  • 大模型赋能心脏骤停预测:精准医疗新曙光
  • DeepSeek-V3:AI语言模型的高效训练与推理之路
  • 常见排序算法
  • MySql面试总结(一)
  • 知识管理平台智能服务架构解析
  • 数据库基础一(初步了解数据库)
  • FFmpeg入门:最简单的视频播放器
  • 营养助力:进行性核上性麻痹患者的饮食管理
  • 数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)
  • 建筑兔零基础人工智能自学记录33|基础知识1
  • 平面设计需要用到的软件/东莞seo优化排名推广
  • 学校网站页面设计/企业如何做网络推广
  • 网站开发范例文档/广州专业seo公司
  • 山西省煤炭厅基本建设局网站/天津网站制作系统
  • 网站建设销售兼职合同/随州今日头条新闻
  • 模板网站做外贸可以吗/成都网站快速排名软件