1、题目描述
【异常的打卡记录】
考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,
公司决定对员工的手机打卡记录进行异常排查。
如果出现以下两种情况,则认为打卡异常:
1、实际设备号与注册设备号不一样
2、或者,同一个员工的两个打卡记录的时间小于60分钟并且打卡距离超过5km。
给定打卡记录的字符串数组clockRecords(每个打卡记录组成为:工号;时间(分钟);打卡距离(km);实际设备号;注册设备号),
返回其中异常的打卡记录(按输入顺序输出)
【示例一】
输入
2
100000,10,1,ABCD,ABCD100000,50,10,ABCD,ABCD
输出
100000,10,1,ABCD,ABCD;100000,50,10,ABCD,ABCD
2、解题思路
将打卡记录转换为Record对象,并判断实际设备号与注册设备号是否相同。如果不相同,将记录标记为异常。
比较打卡记录之间的时间和距离:遍历所有打卡记录,如果同一个员工有2条打卡记录,比较它们之间的时间差和距离差。如果时间差小于60分钟,且距离差大于5公里,将这两条记录标记为异常。
3、参考代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @Author Long* @Date 2023/5/3 15:01*/
public class 异常的打卡记录 {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {int n = Integer.parseInt(in.nextLine());List<Record> records = new ArrayList<>();for (int i = 0; i < n; i++) {String[] str = in.nextLine().split(",");Record record = new Record(Integer.parseInt(str[0]), Integer.parseInt(str[1]),Integer.parseInt(str[2]), str[3], str[4]);record.isAbnormal = !record.actDeviceId.equals(record.regDeviceId);records.add(record);}for (int i = 0; i < records.size(); i++) {for (int j = i + 1; j < records.size(); j++) {if (records.get(i).employeeId == records.get(j).employeeId) {int timeDiff = Math.abs(records.get(i).time - records.get(j).time);int disDiff = Math.abs(records.get(i).distance - records.get(j).distance);if (timeDiff < 60 && disDiff > 5) {records.get(i).isAbnormal = true;records.get(j).isAbnormal = true;}}}}StringBuilder sb = new StringBuilder();for (Record record : records) {if (record.isAbnormal) {sb.append(record.toString()).append(";");}}if (sb.length() == 0) {System.out.println("null");} else {sb.deleteCharAt(sb.length() - 1);System.out.println(sb);}}}
}class Record {int employeeId;int time;int distance;String actDeviceId;String regDeviceId;boolean isAbnormal;public Record(int employeeId, int time, int distance, String actDeviceId, String regDeviceId) {this.employeeId = employeeId;this.time = time;this.distance = distance;this.actDeviceId = actDeviceId;this.regDeviceId = regDeviceId;this.isAbnormal = false;}public String toString() {return employeeId + "," + time + "," + distance + "," + actDeviceId + "," + regDeviceId;}
}
4、相似题目
(1)检测热点字符