华为OD真题-异常的打卡记录

描述

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

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

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

  1. 实际设备号与注册设备号不一样。

  1. 或者,同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。

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

输入描述

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

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

输出描述

输出为异常的打卡记录。

备注

  1. clockRecord长度 <= 1000;

  1. clockRecords[i]格式:{id}, {time}, {distance}, {actualDeviceNumber}, {registeredDeviceNumber};

  1. id由6位数字组成;

  1. time由整数组成,范围为0~1000;

  1. distance由整数组成,范围为0~100;

  1. actualDeviceNumber与registeredDeviceNumber由四位大写字母组成。

示例1

输入:2
     100000,10,1,ABCD,ABCD
     100000,50,10,ABCD,ABCD
输出:100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD
说明:第一条记录是异常的,因为第二条与它的间隔不超过60分钟但是打卡距离超过5km,同理第二条记录也是异常的。

示例2

输入:2
     100000,10,1,ABCD,ABCD
     100000,80,10,ABCE,ABCD
输出:100000,80,10,ABCE,ABCD
说明:第二条记录的注册设备号与打卡设备号不一致,所以是异常记录。

示例3

输入:2
     100000,10,1,ABCD,ABCD
     100001,80,10,ABCE,ABCE
输出:null
说明:无异常打卡记录,所以返回null。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        Map> map = new LinkedHashMap<>();
        Set errors = new LinkedHashSet<>();

        while ((line = br.readLine()) != null) {
            int n = Integer.parseInt(line);
            for (int i = 0; i < n; i++) {
                String[] data = br.readLine().split(",");
                String id = data[0];
                ClockRecord record = new ClockRecord(id, Integer.parseInt(data[1]), Integer.parseInt(data[2]), data[3], data[4]);
                if (null != map.get(id)) {
                    map.get(id).add(record);
                } else {
                    List records = new ArrayList<>();
                    records.add(record);
                    map.put(id, records);
                }
            }

            map.forEach((key, values) -> {
                if (values.size() == 1) {
                    checkDeviceNumber(values.get(0), errors);
                } else if (values.size() > 1) {
                    for (int i = 0, len = values.size(); i < len; i++) {
                        if (i + 1 == len) {
                            checkDeviceNumber(values.get(i), errors);
                        } else {
                            boolean check = checkTimeAndDistance(values.get(i), values.get(i + 1), errors);
                            if (check) {
                                checkDeviceNumber(values.get(i), errors);
                            }
                        }
                    }
                }
            });

            if (errors.size() == 0) {
                System.out.println("null");
            } else {
                StringJoiner joiner = new StringJoiner(";");
                for (ClockRecord error : errors) {
                    joiner.add(error.toString());
                }

                System.out.println(joiner);
            }
        }
        br.close();
    }

    private static boolean checkTimeAndDistance(ClockRecord firstRecord, ClockRecord secondRecord, Set errorRecords) {
        if (Math.abs(firstRecord.time - secondRecord.time) < 60 && Math.abs(firstRecord.distance - secondRecord.distance) > 5) {
            errorRecords.add(firstRecord);
            errorRecords.add(secondRecord);
            return false;
        }
        return true;
    }


    private static void checkDeviceNumber(ClockRecord record, Set errorRecords) {
        if (!record.actualDeviceNumber.equals(record.registeredDeviceNumber)) {
            errorRecords.add(record);
        }
    }

    static class ClockRecord {
        private String id;
        private int time;
        private int distance;
        private String actualDeviceNumber;
        private String registeredDeviceNumber;

        public ClockRecord(String id, int time, int distance, String actualDeviceNumber, String registeredDeviceNumber) {
            this.id = id;
            this.time = time;
            this.distance = distance;
            this.actualDeviceNumber = actualDeviceNumber;
            this.registeredDeviceNumber = registeredDeviceNumber;
        }

        @Override
        public String toString() {
            return id + "," + time + "," + distance + "," + actualDeviceNumber + "," + registeredDeviceNumber;
        }
    }
}

你可能感兴趣的:(华为OD,java)