0
点赞
收藏
分享

微信扫一扫

接口测试-测试点

在这里插入图片描述

一、题目描述

考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据。

为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的收集打卡记录进行异常排查。

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

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

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

二、输入描述

第一行输入为N,表示打卡记录数;

之后的N行为打卡记录,每一行为一条打卡记录。

三、输出描述

按顺序输出异常的打卡记录,分号隔开。

四、Java算法源码

/**
 * 异常打卡标准:
 * 1、实际设备号与注册设备号不一样
 * 2、同一个员工的两个打卡记录的时间小于60分钟 且 打卡距离超过5km。
 *
 * @autor 哪吒编程
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // 打卡记录数
    int num = Integer.parseInt(sc.nextLine());

    // 打卡异常记录
    List<String> errorList = new ArrayList<>();

    // key:工号,value:打卡记录集合
    Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
    for (int i = 0; i < num; i++) {
        // 工号,打卡时间(分钟),打卡距离(km),实际设备号,注册设备号
        String line = sc.nextLine();
        String[] arr = line.split(",");
        // 工号
        int id = Integer.parseInt(arr[0]);
        // 打卡时间(分钟)
        int clockTime = Integer.parseInt(arr[1]);
        // 打卡距离(km)
        int clockDistance = Integer.parseInt(arr[2]);

        // 实际设备号与注册设备号不一样,视为异常打卡
        if (!arr[3].equals(arr[4])) {
            errorList.add(line);
        }

        // 看看是否有同一个员工的重复打卡
        // 同一个员工的两个打卡记录的时间小于60分钟 且 打卡距离超过5km。
        List<String> preList = map.get(id);
        if (preList != null) {
            for (String preLine : preList) {
                // 工号,打卡时间(分钟),打卡距离(km),实际设备号,注册设备号
                String[] split = preLine.split(",");
                // 前后两次的打卡时间差
                int time = Math.abs(Integer.parseInt(split[1]) - clockTime);
                // 前后两次的打卡距离
                int distance = Math.abs(Integer.parseInt(split[2]) - clockDistance);
                // 如果满足 同一个员工的两个打卡记录的时间小于60分钟 且 打卡距离超过5km,则这两次都是异常打卡
                if (time < 60 && distance > 5) {
                    // 打卡异常记录
                    errorList.add(preLine);
                    errorList.add(line);
                }
            }
        }

        List<String> currentList = new ArrayList<String>();
        // 如果包含当前id,追加新的打卡记录
        if (map.containsKey(id)) {
            currentList = map.get(id);
        }

        // 打卡记录
        currentList.add(line);
        map.put(id, currentList);
    }

    if (errorList.size() == 0) {
        System.out.println("null");
        return;
    }

    StringBuilder builder = new StringBuilder();
    for (String error : errorList) {
        builder.append(error).append(";");
    }
    builder.deleteCharAt(builder.length() - 1);

    System.out.println(builder);
}

五、效果展示

1、输入

6
1,10,1,100,100
1,80,10,100,100
1,120,16,100,100
2,80,10,200,200
2,150,15,200,200
3,150,15,200,300

2、输出

1,80,10,100,100;1,120,16,100,100;3,150,15,200,300

3、说明

  1. 根据规则,先比较实际设备号和注册设备号,如果不同,则是异常打卡记录;
  2. 比较相同工号的打卡记录,如果两个打卡记录的时间小于60分钟 且 打卡距离超过5km,则这两次都是异常打卡;

第二条打卡和第三条打卡,打卡时间小于60 且 打卡距离大于5,所以都是异常打卡。

第六条实际设备号和注册设备号不同,为异常打卡。

因此按顺序输出第二条打卡、第三条打卡、第六条打卡。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

举报

相关推荐

0 条评论